2011-09-08 4 views
6

免責事項: ファイルシステムの機能に関する詳細については、私はまったく無知です。私はNTFSを長年使ってきましたが、私が目にした行動だけでなく、私がインターネット上でのドーキングから学んだことに基づいて、何が起こっているのかを推測することができます -File.Moveに「コピー - >削除」が必要か、ファイルシステムテーブル内の場所を変更するかを検出

ありがとうございました'場所A'から '場所B'にファイルを移動するときに、 'File.Copy - > File.Delete'と同等の操作が必要かどうか、または実際のファイルデータをコピーしないかどうかを検出する方法「マスターファイルテーブル」などの場所を更新するだけです。

さまざまな目的のために、大量の大きなファイルを移動することがあります。私はUIの進捗状況を報告したい。

File.Moveを呼び出してあるディスク/パーティション上の場所から別の場所にファイルを移動すると、その関数は効果的にディスク/パーティション間で 'ファイルデータのコピー - 削除'する必要があります。このような状況に遭遇したとき、私は、ファイルがコピーされ、バイトが転送されるときに詳細な進行状況レポートを提供するように、UIでプログレスバーを頻繁に更新できるように、コードを使用できるようになることを検出できるようにしたい。

同じディスク/パーティション上にある場合、マスターファイルテーブル内の場所を更新する速度が非常に速いため、バッチ移動しているファイルごとにfile.Move関数が完了するとプログレスバーが更新されます。

.NET 4(C#)を使用すると、File.Moveの呼び出しで同等の 'コピー - >削除'操作が必要かどうか、または単にファイルテーブルを更新してファイルデータをコピーしないかどうかを他の方法で検出できますか? ?

編集:

私は以下のコメントに注意したように、私はこの行われるかもしれないと思ったどのように可能性が与えられたソースファイルの場所と宛先ファイルの場所は、同じ物理的に配置されているかどうかを検出することですディスク&パーティションがある場合は、正確にその動作を予測し、呼び出す関数を決定することができます - 同じディスクに移動するときに発生すると思われる「ほぼ即時」の更新ファイルシステムテーブルのFile.Move関数/ part、または私のより詳細な 'レポートの進捗状況' x 'bytes copied'カスタムファイルのコピーコード。ファイル転送速度はプログラムが実行されるマシンによって大きく異なるため、可能であれば、詳細な進行状況/現在の転送速度を報告できるようにしたいと考えています。

注 - プログラムは、同じルートパスを持つ異なる物理ディスクを使用するネットワークUNCパスを使用している可能性があります。\\ somename \ shares \ workfolder \ projectは別の物理ディスク上にある可能性があります。\\ somename \ shares \ workfoldder \ otherproject。だから私はパーティションIDまたは物理ディスクIDを検出するためのメソッドが必要ですが、同じディスク/パーティション上のソースと宛先のフォルダ。

あなたは

+0

あなたはこれを尋ねる理由がありますが、私はファイルシステムがこのプロセスで取られた究極の決定についてあなたに知らせることはできません。 ShellFileCopyを使うことができたら、Windowsはコピーや移動中に表示されるちょっとしたダイアログで進捗バーを処理しています。 –

+2

特定のソースファイルの場所とコピー先のファイルの場所が同じ物理ディスクとパーティションにあるかどうかを検出する方法があると思っていました。もしそうなら、正しく動作を予測できます。私は簡単にmsdnでこれを行う方法を見つけることができませんでした。さらに、上記の私のコメントのアプローチがすべてのファイルシステムではうまくいかないかもしれないので、人々が私に注意を促すことを期待していました。 ShellFileCopy APIを使用していただきありがとうございます。私はそれを調べますが、可能であれば自分のライブラリを使いたいと思います。 – JHubbard80

+0

これは、技術的な証拠ではなく、これに対する答えを得るための簡単な方法です。速度。ファイルをコピーすると、実際にファイルを移動している間にすべてのバイトを書き込む必要があり、ファイルのヘッダーを書き換えます。そのため、1GBのファイルを5回動かすようにしてください。それが即座に実行されるならば、動いています。年月がかかると、コピー - >削除です。個人的には、 'System.IO.File.Move()'はファイルを移動すると思います。なぜなら、パフォーマンスのためにコピー - >削除すればばかげてしまうからです。 – Aidiakapi

答えて

2

いつでもP/InvokeをMoveFileWithProgressにすることができます。読みにくい読み物から、ファイルを移動するのではなく、コピーするときに、より詳細な進歩をもたらすように見えます。

また、常にSHFileOperationがあります。これは、WindowsエクスプローラのUIとセマンティクスを提供します。

+0

2番目の提案を使用することはできません。カスタムUI。私は両方の提案をチェックアウトします!ありがとうございます – JHubbard80

1

私はあなたが気になっていないとして、あなたが通常の方法でそのようなことを検出することができないと思いますありがとうございました。あなたがこれをテストすることができれば、知識がないので、ifとelseの場合はどうなるでしょうか(転送の速度を除いて)。

.net。ファイルシステムは抽象化されているので、コピー先のパーティション/ファイルシステム/ネットワークドライブがわからなくても、ある場所から別の場所にファイルを移動することができます。

具体的な問題については、常にプログレスバーを表示して、どちらの場合でも一定の間隔で更新してください。

+0

私は、特定のソースファイルの場所と宛先ファイルの場所が同じ物理ディスクとパーティションにあるかどうかを検出する方法があると思っていました。もしそうならば、私は自分の投稿に記述する振る舞いを正確に予測できます。 IO負荷によっては、プログラムを書くシステムでファイル転送速度が大きく変動するため、ユーザーに正確な進捗インジケータを与えて、正確な完了率を確認し、可能であれば転送速度の差異を確認することをお勧めします。 – JHubbard80

0

シンボリックリンクは物事が1つの大きなパーティションであるように見えますが(WHSがextensivlyを使用するような私の頭の上から)、私は進歩の目的のために言うでしょう同じパーティション(System.IO.Path.GetPathRoot)にとどまっていると仮定すると、おそらく十分でしょう。

0

転送速度と進行状況の監視についてはわかりませんが、ファイルが存在するかどうかを検出する問題別のドライブ/パーティションに移動すると、目的地とソースファイルのドライブ/パーティション文字を比較することができます。

File.Moveのフルパスを使用している場合は、 :

if(sourcePath[0]!=destinationPath[0]) 
    //enable transfer speed monitoring 

あなたはもう少し文字列のパスは解釈して宛先/送信元のドライブ/パーティションを抽出するために必要な相対パスを使用している場合。

解決方法が単純すぎる場合や、他の問題が表示されない場合は申し訳ありません。

+0

異なる物理ディスクを使用する可能性がありますが、同じルートパス(ドライブレターはありません)を含むネットワークUNCパスを使用している可能性があります。\\ somename \ shares \ workfolder \ projectは別の物理ディスクにマップされます。 somename \ shares \ workfolder \ otherprojectをクリックします。私はWindowsでこれを見ることができますが、プログラムで行うことができる必要があります(これが動作を予測するために使用できると判断される場合) – JHubbard80

1

私はあなたがこれを行うことはできないと確信しています。

ローカルドライブのドライブ文字だけを見ても、NTFSでさえ始めると、you can mount a drive inside an empty folder on an existing driveが原因で十分ではありません。つまり、2つのパスに同じドライブ文字があっても、別のディスクにマウントすることができます。

もう1つのステップとして、* nixベースのシステムにマウントされ、Sambaを介して公開されている外部共有も考慮してください。 *シンボリックリンクを使用すると、パスを単独で見ることで、同じ物理デバイス上に2つのパスが存在するかどうかを判断することができなくなります。これらの2つのパスは同じドライブに存在しますか?私は非常に多くの疑念が露呈されるだろう。

私はちょうどFile.Moveを使用し、進行状況の更新を取得しないことに同意します。とにかく、あなた自身のコピーの実装を書くことは、「特に良いアイデアではない」と私を襲います。

+0

良いアイデアええ?私は同意しない - いつも非常にうまくいっていて、私が時間をかけて望んでいたあらゆる種類のものをカスタマイズできるようになる。]私はコントロールフリークです。さまざまな種類の株式でこれを行うのが難しいことに触れてくれてありがとう。私はWindowsで異なるパスのハードディスクIDを手動でプルアップすることができます。私はまだこの情報をプログラム的に収穫する方法を探しますが、それが同じパーティションにあるかどうかわからなくても、それは何もないより優れています。もう一度感謝します - 私は私たちのネットワーク共有上で期待できる特定のファイルシステムを検証しようとします。 – JHubbard80

+0

@ JHubbard80ファイルのコピーと移動は、通常、ユーザー空間では行われません。ユーザー空間では、オペレーティングシステムで最も効果的です。 – Justin

+0

私は1つの項目を明確にしませんでした - 私はしばしば、File.Copyなどよりも優れた報告方法を持つ他の組み込みメソッドをラップしています。これらのメソッドはOS呼び出しを使用すると仮定します。ユーザ空間で「プログラマが」を意味するならば、それは通常、自分でも行われていないことに感謝します。しかし、時には私はそれが必要であり、目標を達成するためにはかなり機能的であることが分かった。ご意見ありがとうございます。 – JHubbard80

0

ボリュームシリアル番号を返すGetFileInformationByHandle()関数をP/Invokeできます。両方のファイルのボリューム通し番号が同じ場合、それらは同じボリューム上にあり、コピーと削除は必要ありません。

関連する問題