2012-05-20 4 views
0

У меня возникла большая проблема, так вот проблема: Я пытаюсь получить файл из каталога, чтобы я мог его перечислить в listview. Когда я рекурсивный поиск файлов, используя этот метод:Рекурсивно присоединить имена каталогов к строке

private void Get_Files(string path) 
    { 
     DirectoryInfo di = new DirectoryInfo(path); 

     FileInfo[] fi = di.GetFiles(); 

     foreach (FileInfo Info in fi) 
     { 
      try 
      { 
       Files.Add(Info.FullName); 
      } 
      catch(Exception ee) 
      { 
       MessageBox.Show(ee.Message); 
      } 
     } 

     foreach (DirectoryInfo DInfo in di.GetDirectories()) 
     { 
      Get_Files(DInfo.FullName); 
     } 
    } 

Иногда путь длиннее 260 символов, поэтому я получаю эту ошибку: Path слишком долго, и она не должна превышать 260 символов, я искал через Интернет, и люди сказали, что у него нет решения, но я понял свое решение. Решение: создает строку и добавляет каждый путь к этой строке, поэтому я никогда не получаю эту ошибку при сохранении всего пути в строке. Подумайте об этом как о том, чтобы разделить друг друга и взять каждую часть и добавить ее в строку. Так вот решение я понял:

List<string> Files = new List<string>(); 

    string completepath = string.Empty; 
    string current_dire_name = string.Empty; 

    private void Get_Files(string path) 
    { 
     DirectoryInfo di = new DirectoryInfo(path); 

     FileInfo[] fi = di.GetFiles(); 

     foreach (FileInfo Info in fi) 
     { 
      try 
      { 
       completepath += "\\" + Info.Name; 
       Files.Add(completepath); 
       string remove_file_name = completepath; 
       remove_file_name = remove_file_name.Replace("\\" + Info.Name, ""); 
       completepath = remove_file_name; 
      } 
      catch(Exception ee) 
      { 
       if(DialogResult.Yes == MessageBox.Show("Error at the Get_Files Method and Error message :\n\n" + ee.Message + "\n\nQuit Application now ?","",MessageBoxButtons.YesNo,MessageBoxIcon.Question)) 
       { 
        Environment.Exit(0); 
       } 
      } 
     } 

     foreach (DirectoryInfo DInfo in di.GetDirectories()) 
     { 
      string remove_folder_name = completepath; 
      remove_folder_name = remove_folder_name.Replace("\\" + current_dire_name, ""); 
      completepath = remove_folder_name; 

      current_dire_name = DInfo.Name; 
      completepath += "\\" + DInfo.Name; 
      Get_Files(DInfo.FullName); 
     } 
    } 

Хорошо, что метод спас меня, но он генерировал неправильный путь, я имею в виду что-то не правильно, позволяет сказать, что если путь должен быть: C: \ Folder1 \ folder2 \ Folder3 \ file.txt Сгенерированный путь: C: \ Folder1 \ file.txt, что-то вроде этого .... Я знаю, что метод, который я сделал, имеет что-то неправильное, особенно рекурсивное добавление.

Надеюсь, что кто-то рисует это со мной, чтобы люди могли избежать исключения на длинные пути.

+1

Это потому, что ваш метод неправильный и не поможет. – SLaks

+0

Метод имеет что-то неправильное, я знаю, это то, что я хочу выяснить, может быть, если кто-то поделился лучшим алгоритмом, который тоже помог бы –

+0

Нет такого обходного пути. 'Get *()' будет терпеть неудачу в строке> 260 символов, независимо от того, как вы построите строку. – SLaks

ответ

1

Вы ищете .Net Long Path library, который использует префикс \\?\ с помощью API Windows, чтобы полностью избежать ограничений.

+0

Эта библиотека должна избегать исключения длинного пути? Все, что я хочу, это получить данные файла, такие как размер и полный путь. –

+0

Да. – SLaks

+0

Библиотека, которую вы мне дали, была предназначена только для .net 4 и была предназначена для работы с копированием/перемещением/удалением/открытием ввода-вывода, целью было получение информации о файлах. Но я нашел другую библиотеку, которая решила проблему, здесь: http: //gallery.technet.microsoft.com/DelimonWin32IO-Library-17cc7893 –

Смежные вопросы