Список каталогов / подкаталогов FTP с использованием edtFTPnet,C#
На моем FTP-сервере у меня есть следующая структура папок
- Parent Directory
-a.txt
-b.txt.old
-SubDirectory1
-c.txt
-NestedSubDirectory1
-d.txt
-SubDirectory2
-e.txt
-f.txt.old
Количество SD не фиксировано. Мне нужен способ получить все файлы (могут быть любого формата) без расширения.old из родительского каталога. В настоящее время я использую сторонний dll edtFTPnet.
ftpConnection.GetFileInfos()Where(f => !(f.Name.EndsWith(".old"))).ToList();
Это помогает мне получить подробную информацию о файлах и папках на текущем уровне рабочего каталога.
Может кто-нибудь сказать мне способ получить все файлы с родительским каталогом, подкаталогами и вложенными подкаталогами.
Решение может использовать или не использовать edtFTPnet.
2 ответа
FTPConnection.GetFileInfos()
возвращает массив FTPFile
, Класс FTPFile
имеет логическое свойство Dir
который указывает, обращается ли его имя файла к файлу (false) или каталогу (true).
Примерно так должно работать:
void ReadSubDirectories(FTPConncetion connection, FTPFile[] files)
{
foreach (var file in files)
{
if (file.Dir)
{
// Save parent directory
var curDir = connection.ServerDirectory;
// Move into directory
connection.ChangeWorkingDirectory(file.Name)
// Read all files
ReadSubDirectories(connection, connection.GetFileInfos());
// Move back into parent directory
connection.ChangeWorkingDirectory(curDir)
}
else
{
// Do magic with your files
}
}
}
Тем не менее, вам может быть лучше использовать только встроенный.NET FtpWebRequest
class, так как его методы и соглашения об именах более понятны, он лучше документирован и легче найти ссылки в Интернете.
Попробуйте использовать такие расширения:
class Program
{
static void Main(string[] args)
{
using (var connection = new FTPConnection
{
ServerAddress = "127.0.0.1",
UserName = "Admin",
Password = "1",
})
{
connection.Connect();
connection.ServerDirectory = "/recursive_folder";
var resultRecursive =
connection.GetFileInfosRecursive().Where(f => !(f.Name.EndsWith(".old"))).ToList();
var resultDefault = connection.GetFileInfos().Where(f => !(f.Name.EndsWith(".old"))).ToList();
}
}
}
public static class FtpClientExtensions
{
public static FTPFile[] GetFileInfosRecursive(this FTPConnection connection)
{
var resultList = new List<FTPFile>();
var fileInfos = connection.GetFileInfos();
resultList.AddRange(fileInfos);
foreach (var fileInfo in fileInfos)
{
if (fileInfo.Dir)
{
connection.ServerDirectory = fileInfo.Path;
resultList.AddRange(connection.GetFileInfosRecursive());
}
}
return resultList.ToArray();
}
}