2

重複の可能性:
ディスク上のファイルのサイズを取得する

C#/windows を使用して、ディスク上の特定のファイルに使用されている実際のバイト数を取得する方法はありますか?

私のアプリケーションは、FileSystemWatcher に似た「ウォッチ」フォルダーを実装しています。一部の監視フォルダーは共有ストレージ (ネットワークとファイバーチャネル SAN の両方) に存在し、その他はローカルに接続されたストレージに存在します。

ファイルは、1 GB から 500 GB を超えるサイズの、完全に制御できないプロセスによって監視フォルダーにコピーされます。共有ファイル システムの性質上、ファイルを「排他的に」開くときに例外 (FileMode.Open、FileAccess.Read、FileShare.None) を期待しても機能しません。

これらのウォッチ フォルダは、ファイルが完全にコピーまたは閉じられるまでアクションを実行することは想定されていません。そうしないと、ダウンストリームで問題が発生する可能性があります。

ディスクで使用される「実際の」ファイルサイズを取得するために、次のことを試しました。

  • System.IO.FileInfo
  • GetFileSizeEx (kernel32 p/invoke)
  • FindFirstFileEx (kernel32 p/invoke)
  • GetCompressedFileSize & GetDiskFreeSpace (kernel32 p/invoke)

どんな提案でも大歓迎です。Windows OS の制限に対処しているように見えますか?

4

3 に答える 3

2

ファイルの「ディスク上のサイズ」を取得する API はありません。ディスク ジオメトリの知識に基づいて自分で計算する必要があります。

于 2012-12-19T21:03:42.820 に答える
1

要約すると、ここでの問題は、他のアプリケーションがコピー先を作成してファイルをコピーし、それを使用SetFileSizeしてファイル サイズを最終的なサイズ (1GB としましょう) に設定し、基本的に完全にゼロで満たされた 1GB のファイルを作成することです。

次に、アプリケーションはファイルの先頭に戻ってシークし、データを順番に入力し始めます。目標は、他のアプリケーションが「データで満たす」のどのポイントに到達したかを判断することです。

残念ながら、この情報を取得する方法はありません。ファイル システムに関する限り、ファイルは存在し、そのサイズは 1GB です。サイズを変更せずにファイルがアクティブに更新されている場合がありますが、これらの内部変更はファイル メタデータで監査されません。ファイルの個々のバイトには「最終更新時刻」はありません。

ファイルのドメイン固有の知識がある場合 (たとえば、最後のバイトがゼロにならないことを知っている場合)、ファイルの最後のバイトをポーリングし、ゼロの場合は元に戻すことができます。

于 2012-12-19T23:16:46.057 に答える
0

GetDiskFreeSpaceを使用すると、クラスター サイズを計算するのに十分な情報を取得できます。この値に切り上げて、ディスク上の実際のサイズ、またはその近似値を取得します。

于 2012-12-19T22:38:45.027 に答える