2011-11-10 12 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/directory/directory1」または「ftp // ip/directory/directory2 /」と指定すると、GetExtensionはString.Emptyを返します。

完全ではない拡張子のないファイルがあった場合や、それが原因で問題が発生する可能性のあるディレクトリがある場合でも、これは可能です。

+0

あなたの答えをありがとう。 FTPサーバー上に拡張子のないファイルがたくさんあることを伝えたいだけです。 – Chamchamal

4

RFC959を参照できるLISTコマンドを使用して、指定されたパスの下にあるアイテムの詳細を取得します。 FileZilla Serverを例にとると、LISTコマンドは、hereという標準のLINUX許可フォーマットを返します。最初の文字は、要求されたパスがファイルかディレクトリかを示します。また、C#で書かれたシンプルなライブラリが見つかりましたhere

0

ターゲットタイプを特定する方法を "ハック"が見つかりました。フォルダに

request.Method = WebRequestMethods.Ftp.GetFileSize; 

を使用する場合、それは例外で なります

未処理の例外:System.Net.WebException:(550)使用できないファイル:リモートサーバー はERRO rを返さ(例えば、ファイルが見つからない、no アクセス)。

ただしファイルに保存すると、自然にサイズが返されます。

私はこのようなメソッドのサンプルコードを作成しています。

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

私は同じ問題を抱えていました。私はヒューの答えを取り除いた。 |

は、あなたがこれを印刷するとき、見えるように起こっている
StreamReader reader = new StreamReader(responseStream); 

      string directoryRaw = null; 

      try { while (reader.Peek() != -1) { directoryRaw += reader.ReadLine() + "|"; } } 
      catch (Exception ex) { Console.WriteLine(ex.ToString()); } 

文字列でのStreamReaderからそれをつかむと、それを固執

request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 

:あなたは次のようにFTPRequestをする必要があります-rw-r-r-- 1ユーザユーザ1699 Jun 1 2015 404.shtml

| drwxr-xr-x 2ユーザユーザ4096 Sep 8 19:39 c GI-ビン

| drwxr-XR-X 2ユーザーユーザー4096 11月3日10時52のCSS

これらがで区切られ|これは分割文字列のデリムになります。

dで始まり、aで始まらない場合は - ディレクトリ、それ以外の場合はファイルです。

これらはすべてファイル名の前に同じサイズです。したがって、これらの文字列のそれぞれを62桁目から始まる新しい文字列にして、ファイル名にします。

希望する

関連する問題