我有一个包含一些FTP pathes,像如下的数组:C#FTP,如何检查路径是文件还是目录?
“的ftp // IP /目录/ directory1中”,
“FTP // IP /目录/ directory2”,
“FTP // IP /directory/file.txt”,
“FTP // IP /目录/ directory3目录”,
“FTP // IP /目录/ another_file.csv”
我如何才能知道路径是文件或一个目录?
在此先感谢。
我有一个包含一些FTP pathes,像如下的数组:C#FTP,如何检查路径是文件还是目录?
“的ftp // IP /目录/ directory1中”,
“FTP // IP /目录/ directory2”,
“FTP // IP /directory/file.txt”,
“FTP // IP /目录/ directory3目录”,
“FTP // IP /目录/ another_file.csv”
我如何才能知道路径是文件或一个目录?
在此先感谢。
没有直接的办法。
间接地,你可以假定没有句点的文件名“。”是目录,但这并不总是如此。
最好的办法是仔细写出消耗这些路径的代码,例如,将路径视为目录,然后如果FTP服务器报告错误,请将其视为文件。
一种方式做到这一点,如果我们可以假设,所有文件都将在一个扩展名结尾,所有目录将不会有一个扩展,我们可以用这样的System.IO.Path.GetExtension()方法:
public bool IsDirectory(string directory)
{
if(directory == null)
{
throw new ArgumentNullException(); // or however you want to handle null values
}
// GetExtension(string) returns string.Empty when no extension found
return System.IO.Path.GetExtension(directory) == string.Empty;
}
这完全不可靠。目录允许有“。”在他们中。 –
您可以使用System.IO.Path.GetExtension(path)',以此来检查,如果您的路径有一个文件扩展名。
鉴于 “FTP // IP /目录/ directory1中” 或 “FTP // IP /目录/ directory2 /”,GetExtension将返回的String.Empty给你。
这也不是万无一失的,如果有一个文件没有扩展名,这将彻底分解,或在它的周期的目录可能会导致问题,这是可能的,但。
感谢您的回答。我只是想让你知道我在FTP服务器上有很多没有扩展名的文件。 – Chamchamal
我发现“黑客”如何确定目标类型。 如果你将一个文件夹上使用
request.Method = WebRequestMethods.Ftp.GetFileSize;
,会造成异常
未处理的异常:System.Net.WebException:远程服务器 返回埃罗R:(550)文件不可用(例如,文件没有找到,没有 访问)。
但使用它的文件,它会自然恢复它的大小。
我已经为这种方法创建了示例代码。
static bool IsFile(string ftpPath)
{
var request = (FtpWebRequest)WebRequest.Create(ftpPath);
request.Method = WebRequestMethods.Ftp.GetFileSize;
request.Credentials = new NetworkCredential("foo", "bar");
try
{
using (var response = (FtpWebResponse)request.GetResponse())
using (var responseStream = response.GetResponseStream())
{
return true;
}
}
catch(WebException ex)
{
return false;
}
}
您可能想要改变它,因为这一个会捕获任何FTP错误。
这个问题很古老,但对于任何需要回答的人来说,最好的机会是使用正则表达式和ListDirectoryDetails。
整个实现此处
如果你给出的只是一个符号链接,那不会有帮助。 – user1932634
是的,但我不认为这是问题的一部分。 – netadictos
的确,我不认为它也是。更多的FYI。 – user1932634
我有同样的问题。我从休斯的回答中解脱出来。你需要做的FTPRequest像:
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
抢它的StreamReader,并把它贴在一个字符串
StreamReader reader = new StreamReader(responseStream);
string directoryRaw = null;
try { while (reader.Peek() != -1) { directoryRaw += reader.ReadLine() + "|"; } }
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
当您打印这个它会看起来像:
| -rw-r - r-- 1个用户用户1699 Jun 1 2015 404.shtml
| drwxr-xr-x 2用户用户4096 Sep 8 19:39 c GI-仓
| drwxr-XR-×2用户的用户4096 11月3日10时52 CSS
这些通过分隔|所以这将是分割字符串的分界线
如果它以d开头而不是 - 然后它是一个目录,否则它是一个文件。
这些在文件名之前的大小都是一样的,所以为从这个位置开始的每个字符串创建一个新的字符串以结束,这将是文件名。
希望它有帮助
您是否有权限访问服务器?如果是这样,怎么样?这个问题缺乏很多细节。 – Dykam
有没有办法告诉路径。 – Oded
如果你没有访问服务器,一个简单的正则表达式检查路径是否有扩展名(即.xxx)是一种微弱但合理的方式去... – Didaxis