ファイルが論理的に移動されるか物理的に移動されるかを判断する方法

StackOverflow https://stackoverflow.com/questions/736859

  •  09-09-2019
  •  | 
  •  

質問

事実:

ファイルを移動する場合、次の 2 つの可能性があります。

  1. ソース ファイルと宛先ファイルは同じパーティション上にあり、ファイル システム インデックスのみが更新されます。
  2. ソースと宛先は 2 つの異なるファイル システム上にあり、ファイルはバイトごとに移動する必要があります。(移動中のコピーとも呼ばれます)

質問:

ファイルが論理的に移動されるか物理的に移動されるかをどのように判断できますか?

私は大きなファイル (700 MB 以上) を転送しているので、状況ごとに異なる動作を採用します。


編集:

ファイルを一度に 1 メガずつコピーするブロッキング IO 呼び出しを実行するワーカー スレッドを使用して、ファイルの移動ダイアログを既にコーディングしました。残り時間や転送速度の目安などの情報をユーザーに提供します。

問題は:ファイルを物理的に移動する前に、論理的に移動できるかどうかを確認するにはどうすればよいですか?

役に立ちましたか?

解決 2

オーケー、私は何かをしている:)

使用する JNA 私はできる Win32 APIを呼び出す (*nix API も) ジャワから.

電話してみました GetFileInformationByHandle 結果は得られましたが、 dwVolumeSerialNumber 属性は常に 0 に等しくなります (私の C で試してみました:そしてD:ドライブ)

次に、MSDN で次の関数を見つけました。 MoveFileEx. 。フラグ パラメータが 0 に設定されている場合、移動時コピー機能は無効になります。 そしてそれはうまくいきます!!!!

だから私はただ電話するだけです

if (!Kernel32.INSTANCE.MoveFileEx(source.getAbsolutePath(), destination.getAbsolutePath(), 0)) {
    System.out.println("logical move failed");
}

に入れるコードは次のとおりです Kernel32.java インターフェイス (このファイルは、 JNA サイト):

boolean MoveFileEx(String lpExistingFileName, String lpNewFileName, int dwFlags);

int MOVEFILE_REPLACE_EXISTING = 0x01;
int MOVEFILE_COPY_ALLOWED = 0x02;
int MOVEFILE_CREATE_HARDLINK = 0x04;
int MOVEFILE_WRITE_THROUGH = 0x08;
int MOVEFILE_DELAY_UNTIL_REBOOT = 0x10;
int MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20;

他のヒント

Linuxや他の* nicesでは、送信元と送信先のディレクトリにstat()を呼び出し、そのst_dev値を比較します。それらが同じである場合、論理的移動を行なうことができる、そうでない場合は+削除物理コピーを実行する必要があります。

Windowsでは、次の2つのディレクトリにハンドルをGetFileInformationByHandle()を呼び出し、そのdwVolumeSerialNumber値を比較することができます。これは、Windows 2000以降が必要であることに注意してください。

あなたは、このOSレベルでの情報アクセスするためのいくつかのポータルが存在しなければならない。

-

私は、Javaを使用している参照(おそらくJNIを?)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top