C# получение файлов из каталога

у меня проблема с моим кодом С#, я хочу перечислить все файлы из папки данных пользователя Mozilla, я пытался сделать это с помощью:

String dir = Directory.GetDirectories(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Mozilla\\Firefox\\Profiles\\")[0];
string[] fileEntries = Directory.GetFiles(Environment.GetEnvironmentVariable("AppData") + "\\Mozilla\\Firefox\\Profiles\\" + dir);

Но когда я выполняю этот код, я получаю сообщение об ошибке, которое говорит мне, что формат этого пути не поддерживается. В информации об ошибке я вижу, что мой путь:

"C:\Users\Marcin\AppData\Roaming\Mozilla\Firefox\Profiles\4wrivbme.default"

Это из-за \? Я уверен, что мне это нужно.


person Marcin Kwarciński    schedule 03.04.2016    source источник


Ответы (2)


Если я правильно понял ваш код, то вторая строка должна быть просто

string[] fileEntries = Directory.GetFiles(dir);

На моем ПК ваша вторая строка возвращает этот путь, который явно неверен

C:\Users\steve\AppData\Roaming\Mozilla\Firefox\Profiles\C:\Users\steve\AppData.....
                                                      ^^^^^

Таким образом, полное исправление вашего кода должно быть таким

string mozillaProfilePath = Path.Combine(
  Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), 
                            "Mozilla\\Firefox\\Profiles");

string[] dirs = Directory.GetDirectories(mozillaProfilePath);
if(dirs.Length > 0)
{
    string[] fileEntries = Directory.GetFiles(dirs[0]);
    ......
}

и, если вы обрабатываете результат прямо здесь, то лучше использовать Directory.EnumeratFiles вместо GetFiles (см. примечания в размещенной ссылке)

.....
if(dirs.Length > 0)
{
    foreach(string file in Directory.EnumerateFiles(dirs[0]))
    {
        .... process each file found ...
    }
}
person Steve    schedule 03.04.2016
comment
проблема повторяется, это из-за точки в имени папки, как я могу это исправить? - person Marcin Kwarciński; 03.04.2016
comment
Я не понимаю. Какая точка? Не могли бы вы добавить в свой код строку, которая выводит значение dir и показывает фактическое значение этой переменной? - person Steve; 03.04.2016
comment
Я исправил проблему, о которой вы сказали, теперь она возвращает: C:\Users\Marcin\AppData\Roaming\Mozilla\Firefox\Profiles\4wrivbme.default Как видите, там точка, а значит, это основная причина проблемы. - person Marcin Kwarciński; 03.04.2016
comment
точка не должна быть проблемой, если вы попробуете вторую строку кода, как сказал @Steve, она должна работать нормально. Он отлично работает для меня. - person Ayman El Temsahi; 03.04.2016
comment
но я сделал это, и он возвращает мне хороший путь, но с неподдерживаемым форматом - person Marcin Kwarciński; 03.04.2016
comment
На моем компьютере C:\Users\steve\AppData\Roaming\Mozilla\Firefox\Profiles\ajny07jk.default и это правильно. У вас должно быть другое значение по умолчанию для конечной папки, но нет проблем, если в имени папки есть точка. Если вы откроете проводник Windows, вы сможете увидеть эту папку (после включения опции отображения скрытых папок) - person Steve; 03.04.2016

Используйте Path.Combine() вместо конкатенации строк.

person Grappachu    schedule 03.04.2016