は、任意の外部ライブラリなしでこれを実装するのは容易ではないよ、私はFTPを持っている
フォルダはとして怒鳴るようなものです。残念ながら、.NET FrameworkやPowerShellでは、ディレクトリ内のファイルを再帰的にリストすることはできません。
あなたがいることを自分で実装する必要があります。サブディレクトリに再帰的
- 一覧リモートディレクトリ
- 反復エントリ、 - それらを再度リストなど
トリッキーな部分は、ファイルを識別することですサブディレクトリから。 .NETフレームワーク(FtpWebRequest
)でポータブルな方法でこれを行う方法はありません。残念ながら、.NETフレームワークはMLSD
コマンドをサポートしていません。このコマンドは、FTPプロトコルのファイル属性を持つディレクトリリストを取得する唯一の移植可能な方法です。 Checking if object on FTP server is file or directoryも参照してください。
あなたのオプションは以下のとおりです。
- は、ファイルのために失敗することが確実であるとディレクトリ(またはその逆)のために成功したファイル名の操作を行います。私。あなたは "名前"をダウンロードしようとすることができます。
- あなたがリスト長いディレクトリを使用してあなたが幸運であり、特定の場合には、あなたが
- (サブディレクトリがいない間、すなわち、すべてのファイルは、拡張子を持つ)ファイル名でディレクトリからファイルを伝えることができます(
LIST
command = ListDirectoryDetails
メソッド)、サーバー固有のリストを解析しようとします。多くのFTPサーバーは* nix形式のリストを使用します。ここでは、エントリの冒頭にd
でディレクトリを指定します。しかし、多くのサーバーは異なる形式を使用します。次の例は、このアプローチ(* nixの形式を仮定して)
static void ListFtpDirectory(string url, NetworkCredential credentials)
{
WebRequest listRequest = WebRequest.Create(url);
listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
listRequest.Credentials = credentials;
List<string> lines = new List<string>();
using (WebResponse listResponse = listRequest.GetResponse())
using (Stream listStream = listResponse.GetResponseStream())
using (StreamReader listReader = new StreamReader(listStream))
{
while (!listReader.EndOfStream)
{
string line = listReader.ReadLine();
lines.Add(line);
}
}
foreach (string line in lines)
{
string[] tokens =
line.Split(new[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries);
string name = tokens[8];
string permissions = tokens[0];
if (permissions[0] == 'd')
{
Console.WriteLine($"Directory {name}");
string fileUrl = url + name;
ListFtpDirectory(fileUrl + "/", credentials);
}
else
{
Console.WriteLine($"File {name}");
}
}
}
利用機能などを使用しています。
NetworkCredential credentials = new NetworkCredential("user", "mypassword");
string url = "ftp://ftp.example.com/directory/to/list/";
ListFtpDirectory(url, credentials);
あなたはサーバ - を解析してトラブルを回避したい場合MLSD
コマンドをサポートしている第三者のライブラリを使用したり、様々なLIST
のリスト形式を解析したりすることができます。コードは、単純に、より堅牢で、プラットフォームに依存しないで
// Setup session options
var sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = "ftp.example.com",
UserName = "user",
Password = "mypassword",
};
using (var session = new Session())
{
// Connect
session.Open(sessionOptions);
// Enumerate files
var options =
EnumerationOptions.EnumerateDirectories | EnumerationOptions.AllDirectories;
IEnumerable<RemoteFileInfo> fileInfos =
session.EnumerateRemoteFiles("/directory/to/list", null, options);
foreach (var fileInfo in fileInfos)
{
Console.WriteLine(fileInfo.FullName);
}
}
だけでなく:
WinSCP .NET assemblyとたとえば、あなたはSession.EnumerateRemoteFiles
に1回の呼び出しで再帰的にディレクトリ全体を一覧表示することができます。 RemoteFileInfo
classを介して他のすべてのファイル属性(サイズ、変更時刻、許可、所有権)を簡単に利用できるようにします。
内部的には、サーバによってサポートされている場合、WinSCPはMLSD
コマンドを使用します。そうでない場合は、LIST
コマンドを使用し、数多くの異なるリスト形式をサポートします。
は
%の2Fは、CD(ディレクトリ変更)に相当します(私はWinSCPのの著者です)。 msdnを参照してください:https://social.msdn.microsoft.com/Forums/en-US/91e2bed0-9e5e-4503-9e66-d224086e43a8/change-directory-with-ftpwebrequest?forum=ncl – jdweng