C#を使用してディスクに大きな(物理的に)連続したファイルを作成することはできますか?管理対象コードのみを使用することをお勧めしますが、不可能な場合はアンマネージドソリューションを評価してください。要するにC#を使用して連続ファイルを作成しますか?
答えて
デフラグツールの作成?
あなたはとにかくデフラグAPI後にしているように聞こえる: -
http://msdn.microsoft.com/en-us/library/aa363911%28v=vs.85%29.aspx
リンク下から、あなたが誰かが親切に生産しているのC#ラッパーを見逃しているようだcosを。
http://blogs.msdn.com/b/jeffrey_wall/archive/2004/09/13/229137.aspx
ええ、多分。しかし、C#ではこれをしないでください。 –
正直言って、管理されていませんが、この唯一の解決策は連続したファイルを生成する可能性があることを示しています。 – tmitchel2
には、その後
OSは、バックグラウンドでこれを行いません、私は何だろうと、あなたはそれがあることを期待ほどの大きなファイル、OSはcontigouslyそれを配置しますその方法を作るです。ファイルを拡張する必要がある場合は、毎回同じように10%増やします。 これは、SQLサーバーがデータベースファイルをどのように保持するかをシミュレートしたものです。
FileStreamを開くと、appendで開くことができます。
例:
FileStream fwriter = new FileStream("C:\\test.txt", FileMode.Append, FileAccess.Write, FileShare.Read);
作成した任意のファイルは論理的に連続になります。
物理的に連続したい場合は、OSとFSの領域にあります。通常のI/O APIの制御をはるかに超えた(遠い)。
しかし、おそらく近くに来るのは、スペースを最前面に要求することです:空のストリームを作成し、必要な長さまたは位置のプロパティを設定します。
現代のファイルシステムでは、ハードディスク上に連続したファイルを確保することは困難です。論理的にはファイルは常に連続していますが、データを保持する物理ブロックはファイルシステムによって異なります。
これは、古いファイルシステム(ext2、FAT32など)を使用して、必要なファイルサイズにシークしてからこのファイルをフラッシュして大きなファイルを要求することです。より最新のファイルシステムはおそらく大きなファイルサイズをマークしますが、実際にはハードディスクに何も書き込まず、実際には読まなくても将来の読み取りではゼロを返します。
int fileSize = 1024 * 1024 * 512;
FileStream file = new FileStream("C:\\MyFile", FileMode.Create, FileAccess.Write);
file.Seek(fileSize, SeekOrigin.Begin);
file.Close();
Askerがこれを最初にやりたい理由は、彼がデータベースを実装しようとしていることを考えると、古いファイルシステムを使用することはできません。 FAT32は、特に4GBの最大ファイルサイズに制限されています。私はext2にも同様の制限があると信じていますが(2GBまたは4GB程度)、そのファイルシステムに関する経験はありませんので、わかりません。また、FAT32が物理的に連続したブロックを返すという保証もありません。 –
あなたはそれについて正しいです。 FAT32は、Ext4、他の現在のファイルシステムのNTFS、特にジャーナルファイルシステムよりもそうする傾向があります。もちろん保証はありませんが、他の人が提案している最適化APIのようなファイルシステムレベルのツールにアクセスすることはありません。これは私ができる最良の提案です。 –
データベースを構築するには、スキャッタ・ギャザーのWindows APIが提供するI/O機能を使用する必要があります。これは、ファイルのデータをメモリに「散布」するか、メモリからデータを収集してファイルの連続領域に書き込むことを可能にする特別なタイプのファイルI/Oです。データが散在するバッファまたはバッファから収集されるバッファは連続している必要はありませんが、ソースまたは宛先ファイル領域は常に連続しています。
この機能は、両方とも非同期に動作する2つの主要な機能で構成されています。 ReadFileScatter
functionは、ディスク上のファイルから連続したデータを読み取り、それを不連続なメモリバッファの配列に書き込みます。 WriteFileGather
functionは、メモリバッファから非連続データを読み取り、ディスク上の連続したファイルに書き込みます。もちろん、これらの機能の両方で使用されるOVERLAPPED
structureも必要です。
これは、データベースおよびログファイルの読み取りおよび書き込み時にSQL Serverが使用するもので、実際にはSQL Server用の初期のNT 4.0サービスパックにこの機能が追加されています。
もちろん、これはかなり高度なレベルのものであり、心のかすかなものではありません。意外にも、実際にはpinvoke.netでP/Invokeの定義を見つけることができますが、私はそのサイトに懐疑的な疑念を抱いています。これらの関数がどのように機能するかを理解するためには、ドキュメンテーションに多くの時間を費やす必要があるので、宣言を自分で記述することもできます。そして、C#からやってみると、あなたにはさらに問題のホストがたくさんあります。それで私はそれをお勧めしません。この種のI/Oパフォーマンスが重要な場合は、間違ったツールを使用していると思います。
貧しい人の解決策は、contig.exeです。無料のダウンロードファイルhereが入手可能です。
- 1. リスナーを使用してテキストとボタンを連続して作成しますか?
- 2. アレイを連続して作成する
- 3. C/C++を使用して.comファイルを作成するには?
- 4. C++を使用してトゥイーン関数を作成しますか?
- 5. Rのpaste0()を使用して "A01〜A15"の4つの連続したベクトルを作成しますか?
- 6. STLコンテナを使用して連続する行列変数を作成する
- 7. 7zipライブラリを使用して7zipファイルを作成するc#
- 8. C++メソッドを使用してJSONファイルを作成する方法
- 9. カスタムビルドツールを使用してC#ファイルを作成する
- 10. whileループを使用して連続ユニバースを作成する方法
- 11. Flashを使用して連続PNGスプライトシートを生成できますか?
- 12. タイマーがC#を使用してファイルを作成していません
- 13. File.Deleteを使用してファイルを削除し、Streamwriterを使用して同じファイルを作成しますか?
- 14. NSURLConnection sendAsynchronousRequest:queue:completionHandler:複数のリクエストを連続して作成していますか?
- 15. ハードリンクを使用して連結ファイルをシミュレートしますか?
- 16. File.Createを使用してExcelファイルを作成できますか?
- 17. C#を使用してWP7でPDFファイルを作成
- 18. C++を使用してiOSでディレクトリ/ファイルを作成
- 19. C#とデータベースを使用してクイズアプリケーションを作成します
- 20. C#ドラッグしてファイルを作成して
- 21. writeToFileの使用:アトミック:連続して動作しません...なぜですか?
- 22. CまたはC++を使用してAPKを作成できますか?
- 23. Windowsサービスを使用してC#またはVB.netを使用してCSVファイルを作成、更新、削除する
- 24. 既存のCファイルを使用してEclipseプロジェクトで作成
- 25. C#連続使用ステートメント
- 26. Log4Netを使用してファイルを作成していません
- 27. .batファイルを使用して隠しファイルを作成する
- 28. 複数のファイルをC++で連続してストリームする
- 29. C#、GPOを作成し、Microsoft.GroupPolicy.Managementを使用してOUにリンクしますか?
- 30. Visual Studio 2010を使用してASP.NET MVC2用のWCFデータソースを使用してRDL(C)を作成しますか?
なぜ物理的に連続したファイルが必要だと思いますか?どのような問題を解決しようとしていますか? –
私は一種のnosqlデータベースを構築していますが、ディスクのパフォーマンスは優先されます。 mysql、sqlserverなどのデータベースソリューションは、パフォーマンスを向上させるために常に連続したファイルを使用します。 – tmitchel2