Способ получения всех файлов в папке и вложенных папках, которые возвратят список
У меня есть метод, который будет проходить через папку и все ее подпапки и получить список путей к файлу. Однако я мог только выяснить, как его создать и добавить файлы в открытый список, но не как вернуть список. Здесь метод:
public List<String> files = new List<String>();
private void DirSearch(string sDir)
{
try
{
foreach (string f in Directory.GetFiles(sDir))
{
files.Add(f);
}
foreach (string d in Directory.GetDirectories(sDir))
{
DirSearch(d);
}
}
catch (System.Exception excpt)
{
MessageBox.Show(excpt.Message);
}
}
Итак, я просто вызываю DirSearch()
в какой-то момент своего кода, и он заполняет список с помощью путей, но я хочу иметь возможность использовать его несколько раз для создания разных списков с разными каталогами и т.д.
Ответы
Ответ 1
private List<String> DirSearch(string sDir)
{
List<String> files = new List<String>();
try
{
foreach (string f in Directory.GetFiles(sDir))
{
files.Add(f);
}
foreach (string d in Directory.GetDirectories(sDir))
{
files.AddRange(DirSearch(d));
}
}
catch (System.Exception excpt)
{
MessageBox.Show(excpt.Message);
}
return files;
}
и если вы не хотите загружать весь список в память и избегать блокировки, вы можете взглянуть на following answer
.
Ответ 2
Вы можете использовать Directory.GetFiles для замены своего метода.
Directory.GetFiles(dirPath, "*", SearchOption.AllDirectories)
Ответ 3
Просто используйте это:
public static List<String> GetAllFiles(String directory)
{
return Directory.GetFiles(directory, "*.*", SearchOption.AllDirectories).ToList();
}
И если вы хотите, чтобы каждый файл, даже без расширения:
public static List<String> GetAllFiles(String directory)
{
return Directory.GetFiles(directory, "*", SearchOption.AllDirectories).ToList();
}
Ответ 4
вы можете использовать что-то вроде этого:
string [] filePaths = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
вместо использования "." вы можете ввести имя файла или просто тип типа "*.txt"
также SearchOption.AllDirectories - это поиск во всех подпапках, которые вы можете изменить, если вы хотите только один уровень
подробнее о том, как использовать его на здесь
Ответ 5
Я не уверен, почему вы добавляете строки в files
, который объявляется как поле, а не временная. Вы можете изменить подпись DirSearch
на:
private List<string> DirSearch(string sDir)
И после блока catch
добавьте:
return files;
В качестве альтернативы вы можете создать временную переменную внутри своего метода и вернуть ее, что мне кажется подходящим для вас способом. В противном случае, каждый раз, когда вы вызываете этот метод, вновь найденные строки будут добавлены в тот же список, что и раньше, и у вас будут дубликаты.
Ответ 6
Попробуйте это
классная программа { static void Main (string [] args) {
getfiles get = new getfiles();
List<string> files = get.GetAllFiles(@"D:\Rishi");
foreach(string f in files)
{
Console.WriteLine(f);
}
Console.Read();
}
}
class getfiles
{
public List<string> GetAllFiles(string sDirt)
{
List<string> files = new List<string>();
try
{
foreach (string file in Directory.GetFiles(sDirt))
{
files.Add(file);
}
foreach (string fl in Directory.GetDirectories(sDirt))
{
files.AddRange(GetAllFiles(fl));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return files;
}
}
Ответ 7
String[] allfiles = System.IO.Directory.GetFiles("path/to/dir", "*.*", System.IO.SearchOption.AllDirectories);