在我的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。
答案 0 :(得分: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
类,因为它的方法和命名约定更清晰,更好地记录,并且更容易在线查找引用。
答案 1 :(得分:0)
尝试使用这样的扩展程序:
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();
}
}