FTPサーバー上のファイルの存在を確認する効率的な方法はありますか? Apache CommonsNetを使用しています。 listNames
のFTPClient
メソッドを使用して特定のディレクトリ内のすべてのファイルを取得し、このリストを調べて特定のファイルが存在するかどうかを確認できることはわかっていますが、そうではありません。特にサーバーに多くのファイルが含まれている場合は効率的だと思います。
listFiles(String pathName)
は、単一のファイルに対しては問題なく機能するはずです。
listFiles
(または mlistDir
)呼び出しでファイルへのフルパスを使用すると、受け入れられた回答が示すように、実際に機能するはずです。
String remotePath = "/remote/path/file.txt";
FTPFile[] remoteFiles = ftpClient.listFiles(remotePath);
if (remoteFiles.length > 0)
{
System.out.println("File " + remoteFiles[0].getName() + " exists");
}
else
{
System.out.println("File " + remotePath + " does not exists");
}
RFC 959LIST
コマンドに関する部分のセクション4.1.3には次のように書かれています。
パス名でファイルが指定されている場合、サーバーはファイルに関する現在の情報を送信する必要があります。
ただし、多くのファイルをチェックする場合、これはかなり効果がありません。 LIST
コマンドの使用には、実際にはいくつかのコマンドが含まれ、それらの応答を待機し、主にデータ接続を開きます。新しいTCP/IP接続を開くことは、暗号化が使用されている場合、さらにコストのかかる操作です(最近は必須です)。
また、LIST
コマンドは、フォルダーの内容全体が転送されるため、フォルダーの存在をテストするのにさらに効果的ではありません。
サーバーがサポートしている場合は、 mlistFile
(MLST
コマンド)を使用する方が効率的です。
String remotePath = "/remote/path/file.txt";
FTPFile remoteFile = ftpClient.mlistFile(remotePath);
if (remoteFile != null)
{
System.out.println("File " + remoteFile.getName() + " exists");
}
else
{
System.out.println("File " + remotePath + " does not exists");
}
このメソッドは、ディレクトリの存在をテストするために使用できます。
MLST
コマンドは個別の接続を使用しません(LIST
とは異なります)。
サーバーがMLST
コマンドをサポートしていない場合は、abusegetModificationTime
(MDTM
コマンド):
String timestamp = ftpClient.getModificationTime(remotePath);
if (timestamp != null)
{
System.out.println("File " + remotePath + " exists");
}
else
{
System.out.println("File " + remotePath + " does not exists");
}
このメソッドは、ディレクトリの存在をテストするために使用できません。
受け入れられた答えは私にはうまくいきませんでした。
コードが機能しませんでした:
String remotePath = "/remote/path/file.txt";
FTPFile[] remoteFiles = ftpClient.listFiles(remotePath);
代わりに、これは私のために働きます:
ftpClient.changeWorkingDirectory("/remote/path");
FTPFile[] remoteFiles = ftpClient.listFiles("file.txt");