2011-11-10 64 views
3

我有一个包含一些FTP pathes,像如下的数组:C#FTP,如何检查路径是文件还是目录?

“的ftp // IP /目录/ directory1中”,
“FTP // IP /目录/ directory2”,
“FTP // IP /directory/file.txt”,
“FTP // IP /目录/ directory3目录”,
“FTP // IP /目录/ another_file.csv”

我如何才能知道路径是文件或一个目录?

在此先感谢。

+0

您是否有权限访问服务器?如果是这样,怎么样?这个问题缺乏很多细节。 – Dykam

+1

有没有办法告诉路径。 – Oded

+0

如果你没有访问服务器,一个简单的正则表达式检查路径是否有扩展名(即.xxx)是一种微弱但合理的方式去... – Didaxis

回答

2

没有直接的办法。

间接地,你可以假定没有句点的文件名“。”是目录,但这并不总是如此。

最好的办法是仔细写出消耗这些路径的代码,例如,将路径视为目录,然后如果FTP服务器报告错误,请将其视为文件。

3

一种方式做到这一点,如果我们可以假设,所有文件都将在一个扩展名结尾,所有目录将不会有一个扩展,我们可以用这样的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; 
} 
+0

这完全不可靠。目录允许有“。”在他们中。 –

0

您可以使用System.IO.Path.GetExtension(path)',以此来检查,如果您的路径有一个文件扩展名。

鉴于 “FTP // IP /目录/ directory1中” 或 “FTP // IP /目录/ directory2 /”,GetExtension将返回的String.Empty给你。

这也不是万无一失的,如果有一个文件没有扩展名,这将彻底分解,或在它的周期的目录可能会导致问题,这是可能的,但。

+0

感谢您的回答。我只是想让你知道我在FTP服务器上有很多没有扩展名的文件。 – Chamchamal

4

使用LIST命令,你可以参考RFC959,以获取有关指定路径下的项目的详细信息。以FileZilla Server为例,LIST命令将返回标准的LINUX权限格式,您可以在其中找到here。第一个字母表示请求的路径是文件还是目录。还用C#编写一个简单的库可以发现here

0

我发现“黑客”如何确定目标类型。 如果你将一个文件夹上使用

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错误。

0

这个问题很古老,但对于任何需要回答的人来说,最好的机会是使用正则表达式和ListDirectoryDe​​tails。

整个实现此处

http://blogs.msdn.com/b/adarshk/archive/2004/09/15/sample-code-for-parsing-ftpwebrequest-response-for-listdirectorydetails.aspx

+0

如果你给出的只是一个符号链接,那不会有帮助。 – user1932634

+0

是的,但我不认为这是问题的一部分。 – netadictos

+0

的确,我不认为它也是。更多的FYI。 – user1932634

2

我有同样的问题。我从休斯的回答中解脱出来。你需要做的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开头而不是 - 然后它是一个目录,否则它是一个文件。

这些在文件名之前的大小都是一样的,所以为从这个位置开始的每个字符串创建一个新的字符串以结束,这将是文件名。

希望它有帮助

相关问题