,我读了FTP文件/文件夹列表。检查是否是文件或文件夹上的FTP
问题是,我不知道,如果是文件或文件夹。 目前我正在检查字符串是否有扩展名。如果是,则是文件,否则为文件夹。但是,这还不够好,它可以存在的文件没有扩展名和文件夹的扩展名(例如,文件夹名称可能是FolderName.TXT。)
这是代码,我用它来列出文件夹的内容:
public async Task<CollectionResult<string>> ListFolder(string path)
{
try
{
FtpWebRequest ftpRequest = null;
var fileNames = new List<string>();
var res = new CollectionResult<string>();
ftpRequest = ftpBuilder.Create(path, WebRequestMethods.Ftp.ListDirectory);
using (var ftpResponse = (FtpWebResponse)await ftpRequest.GetResponseAsync())
using (var ftpStream = ftpResponse.GetResponseStream())
using (var streamReader = new StreamReader(ftpStream, Encoding.UTF8))
{
string fileName = streamReader.ReadLine();
while (!string.IsNullOrEmpty(fileName))
{
fileNames.Add(Path.Combine(path, fileName.Substring(fileName.IndexOf('/') + 1, fileName.Length - fileName.IndexOf('/') - 1)));
fileName = streamReader.ReadLine();
}
}
ftpRequest = null;
res.ListResult = fileNames;
return res;
}
catch (Exception e)
{
e.AddExceptionParameter(this, nameof(path), path);
throw;
}
}
如果我能够在while循环中检测到文件或文件夹是最好的,但是不可能仅从字符串中进行此操作。
谢谢你的帮助。
编辑
我发现类似的问题。 C# FTP, how to check if a Path is a File or a Directory? 但问题是很老,也没有很好的解决方案。
编辑:解
public async Task<CollectionResult<Tuple<string, bool>>> ListFolder(string path)
{
try
{
FtpWebRequest ftpRequest = null;
var fileNames = new CollectionResult<Tuple<string, bool>>();
fileNames.ListResult = new List<Tuple<string, bool>>();
if (!(IsFtpDirectoryExist(path)))
{
throw new RemoteManagerWarningException(ErrorKey.LIST_DIRECTORY_ERROR, fileNames.ErrorMessage = $"path folder {path} not exists");
}
ftpRequest = ftpBuilder.Create(path, WebRequestMethods.Ftp.ListDirectoryDetails);
using (var ftpResponse = (FtpWebResponse)await ftpRequest.GetResponseAsync())
using (var ftpStream = ftpResponse.GetResponseStream())
using (var streamReader = new StreamReader(ftpStream, Encoding.UTF8))
{
while (!streamReader.EndOfStream)
{
string line = streamReader.ReadLine();
string[] tokens = line.Split(new[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries);
// is number:
Regex rgx = new Regex(@"^[\d\.]+$");
var isExternalFtpOrUnixDirectoryStyle = !(rgx.IsMatch(line[0].ToString()));
string name = string.Empty;
bool isFolder = false;
if (isExternalFtpOrUnixDirectoryStyle)
{
name = tokens[8];
var permissions = tokens[0];
isFolder = permissions[0] == 'd';
}
else
{
tokens = line.Split(new[] { ' ' }, 4, StringSplitOptions.RemoveEmptyEntries);
name = tokens[3];
isFolder = tokens[2] == "<DIR>";
}
name = Path.Combine(path, name);
Tuple<string, bool> tuple = new Tuple<string, bool>(name, isFolder);
fileNames.ListResult.Add(tuple);
}
}
ftpRequest = null;
return fileNames;
}
catch (Exception e)
{
e.AddExceptionParameter(this, nameof(path), path);
throw;
}
}