Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 15

Поисковик файлов. Если путь к файлу содержит больше 248 символов, то программа выдает ошибку

14.02.2014, 20:54. Показов 1254. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем проблема такая, пишу в VS2010, здесь нашел код одного поисковика, немного изменил :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Data;
//using System.Drawing;
//using System.Linq;
//using System.Text;
using System;
using System.Windows.Forms;
using System.IO;//для DirectoryInfo
using System.Diagnostics;//для Process
using System.Threading;
using System.Runtime.InteropServices;
using System.Text;
 
 
namespace rosskyru
{
    public partial class SearchForm : Form
    {
        Thread thread1,
               thread2;
 
 
        public SearchForm()
        {
            InitializeComponent();
        }
 
      
      
         /// <summary>
         /// описываем поиск для первого потока
         /// </summary>   
          public void search()
        {
          
            try
            {
               
                //_bClear_Click(object sender, e);//очищаем поле с предыдущими результатами
 
                DirectoryInfo dir = new DirectoryInfo(_tbView.Text);
                string file =_tbFile.Text;
                Invoke(new FindInDirDelegate(FindInDir), new object[] { dir, file, _cbRecurs.Checked });
              //  FindInDir(dir, file, _cbRecurs.Checked);//если не нажат чекбокс, то поиск будет идти только в заданной папке          
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
     
         /// <summary>
         /// описываем поиск для второго потока
         /// </summary>
         public void search2()
         {
             try
             {
                // _bClear_Click(sender, e);//очищаем поле с предыдущими результатами            
                 DirectoryInfo dir2 = new DirectoryInfo(_tbView2.Text);
                 string file =_tbFile2.Text;
                 Invoke(new FindInDirDelegate(FindInDir), new object[] { dir2, file, _cbRecurs.Checked });
               //  FindInDir(dir2, file, _cbRecurs.Checked); //если не нажат чекбокс, то поиск будет идти только в заданной папке
             }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
             }
         }
         /// <summary>
         /// обработка нажатия по кнопке "искать!"
         /// </summary>
         /// 
 
        void _bFind_Click(object sender, EventArgs e)
         {
             thread1 = new Thread(this.search);
             thread1.Start();
             thread2 = new Thread(this.search2);
             thread2.Start();         
        }
 
        /// <summary>
        /// поиск файла в папке
        /// </summary>
        /// <param name="dir">в какой папке искать</param>
        /// <param name="pattern">какой файл искать</param>
        /// <param name="recursive">искать ли в подпапках</param>
  public delegate void FindInDirDelegate(DirectoryInfo dir, string pattern, bool recursive);
 
  public void FindInDir(DirectoryInfo dir, string pattern, bool recursive)
  {
      try
      {
 
 
          foreach (FileInfo file in dir.GetFiles(pattern))
          {
 
              _lbAnser.Items.Add(pattern);
 
          }
          if (recursive)
          {
              foreach (DirectoryInfo subdir in dir.GetDirectories())
              {
                  FindInDir(subdir, pattern, recursive);
              }
          }
      }
  
      catch
      {
         return;
      }
        }
 
 
      
 
        /// <summary>
        /// поиск файла в директории
        /// </summary>
        /// <param name="dir">где искать</param>
        /// <param name="pattern">имя файла для поиска</param>
         void FindFiles(string dir, string pattern)
      {
         
            FindInDir(new DirectoryInfo(dir), pattern, true);
        }
 
        /// <summary>
        /// обработка нажатия по кнопке "обзор"
        /// </summary>
        private void _bView_Click(object sender, EventArgs e)
        {
            if (_fBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                _tbView.Text = _fBrowserDialog.SelectedPath;
            }
        }
 
        /// <summary>
        /// обработка нажатия по кнопке "очистить"
        /// </summary>
        private void _bClear_Click(object sender, EventArgs e)
        {            
          _lbAnser.Items.Clear();
        }
 
        /// <summary>
        /// обработка нажатия по кнопке "очистить все"
        /// </summary>
        private void _bClearAll_Click(object sender, EventArgs e)
        {
            this._tbFile.Text = "";
            this._tbView.Text = "";
            this._tbView2.Text = "";
            this._lbAnser.Items.Clear();
        }
 
        /// <summary>
        /// обработка двойного клика мыши по результатам
        /// </summary>
        private void lbAnswer_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Process.Start(this._lbAnser.SelectedItem.ToString());//пытаемся открыть файл программой по умолчанию
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            if (_fBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                _tbView2.Text = _fBrowserDialog.SelectedPath;
            }
        }
 
        private void _tbFile2_TextChanged(object sender, EventArgs e)
        {
 
        }
 
     
    }
}
Проблема заключается в следующем, если путь к файлу содержит больше 248 символов, то программа выдает мне ошибку foreach (FileInfo file in dir.GetFiles(pattern)) на этом месте и все, хотя стандартный виндовский поисковик с такими ситуациями справляется, как мне обойти эту проблему, чтобы нужный файл находился не смотря на то, что путь до него содержит больше 248 символов, не могу ничего придумать, надеюсь на вашу помощь.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2014, 20:54
Ответы с готовыми решениями:

HXT выдаёт ошибку если указать полный путь к файлу
Задумал я приделать к своей проге xml-конфиг. module HXT_XML_Test(ProgCfg(..),loadProgCfg,cfgFilePath) where import...

Передать командной строке параметр (путь к файлу), если он содержит пробел
В частности, редактор реестра: REG EXPORT &lt;раздел&gt; &lt;имя файла&gt; reg.exe export HKCU\........\Internet Explorer C:\txt.reg пишет что...

При попытке получить файлы из папки выдаёт ошибку "Путь содержит недопустимые знаки"
DirectoryInfo dir = new DirectoryInfo(@&quot;L:\Development&quot;); files = dir.GetFiles(&quot;*&quot;, SearchOption.AllDirectories);

4
30 / 29 / 18
Регистрация: 19.12.2012
Сообщений: 144
Записей в блоге: 1
14.02.2014, 23:24
Ну я бы например сплитил путь слешами и дальше собирал бы с конца, то есть file_name.extension + \ + подкаталог n + \ + подкаталог n - 1 + [...], пока не набиралось бы 248, то есть если набираем, то откатываем добавление последнего каталога, вызвавшее переполнение, потом разворачиваем строку задом наперед и ищем.
0
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 15
14.02.2014, 23:35  [ТС]
ну допустим файл лежит в папке C:\temp\[здесь папка из 244 символов]\proj\искомый файл, когда программа доходит до папки proj - выдает ошибку, а в саму папку не заглядывает даже
0
30 / 29 / 18
Регистрация: 19.12.2012
Сообщений: 144
Записей в блоге: 1
14.02.2014, 23:38
Вот это интересно конечно, длина папки то до 255...а как ты понял что именно 248?
0
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 15
15.02.2014, 12:07  [ТС]
Цитата Сообщение от Iwillbeagod Посмотреть сообщение
Вот это интересно конечно, длина папки то до 255...а как ты понял что именно 248?
Мне выдает ошибку PathTooLongException длина каталога не должна превышать 248 символов, а полное имя файла 260
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2014, 12:07
Помогаю со студенческими работами здесь

Если строка из загруженного файла содержит больше, чем 50 символов, то нужно разделить её на две части
Помогите дополнить программу. В программу загрузить text файл, обработать его и вывести результат в другой text файл. Если строка из...

Выдает ошибку если в файле более 106 символов
procedure TForm1.Button1Click(Sender: TObject); var MasText :array of string; Ft :TextFile;//текстовый файл ...

Программа выдает ошибку, если элемент не существует
Функция получает два итератора и значение типа int. Если значение найдено, то возвращает итератор на найденный элемент. Если значение не...

QOpenFileDialog -> Путь к файлу содержит Кириллицу
День добрый. Имеется следующий код: QString fileName = QFileDialog::getOpenFileName( this, &quot;Открыть файл Базы Данных&quot; , ...

Если файл в utf записан простым текстовым редактором - программа выдает ошибку
плиз помогите кто знает что за прикол такой прогу сделал работает, она считыает файл в кодировке utf. Но если utf записан не явой а простым...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru