web-dev-qa-db-ja.com

FTPサーバー上のファイルの存在を確認しています

FTPサーバー上のファイルの存在を確認する効率的な方法はありますか? Apache CommonsNetを使用しています。 listNamesFTPClientメソッドを使用して特定のディレクトリ内のすべてのファイルを取得し、このリストを調べて特定のファイルが存在するかどうかを確認できることはわかっていますが、そうではありません。特にサーバーに多くのファイルが含まれている場合は効率的だと思います。

15

listFiles(String pathName)は、単一のファイルに対しては問題なく機能するはずです。

21

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コマンドは、フォルダーの内容全体が転送されるため、フォルダーの存在をテストするのにさらに効果的ではありません。


サーバーがサポートしている場合は、 mlistFileMLSTコマンド)を使用する方が効率的です。

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コマンドをサポートしていない場合は、abusegetModificationTimeMDTMコマンド):

String timestamp = ftpClient.getModificationTime(remotePath);
if (timestamp != null)
{
    System.out.println("File " + remotePath + " exists");
}
else
{
    System.out.println("File " + remotePath + " does not exists");
}

このメソッドは、ディレクトリの存在をテストするために使用できません

10
Martin Prikryl

受け入れられた答えは私にはうまくいきませんでした。

コードが機能しませんでした:

String remotePath = "/remote/path/file.txt";
FTPFile[] remoteFiles = ftpClient.listFiles(remotePath);

代わりに、これは私のために働きます:

ftpClient.changeWorkingDirectory("/remote/path");
FTPFile[] remoteFiles = ftpClient.listFiles("file.txt");
0
Aadi