親フォルダの削除/名前変更を許可する方法でファイルを開くことはできますか?(本当に)ロックしていないファイルを開きますか?
私はあなたがこれを行うことができます知っている:
ファイルハンドルを閉じたときにファイルが削除されるのを許可しますFile.Open("foo.bar", FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete)
。ただし、親フォルダをエラーなしで削除することはできません。
フレームワークで何も見つかりませんでした。私は何かを見過ごしたか、それとも私が相互に利用できるネイティブAPIがありますか?
注:削除したファイルのストリームを使用しているときに例外が発生するかどうかは関係ありません。実際にはそれは理想的でしょう。
UPDATE:
だから、最も有望なアイデアは、しかし、私はちょうどそれを動作させることができない、Hardlinkました。私はまだ私が親ディレクトリを削除しようとするとアクセス拒否で終わる。ここに私のコードです:
class Program
{
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, IntPtr lpSecurityAttributes);
static void Main(string[] args)
{
string hardLinkPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
string realPath = @"C:\foo\bar.txt";
if (CreateHardLink(hardLinkPath, realPath, IntPtr.Zero))
{
using (FileStream stream = File.Open(hardLinkPath, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite))
{
Console.Write("File locked");
Console.ReadLine();
}
File.Delete(hardLinkPath);
}
else
Console.WriteLine("LastError:{0}", Marshal.GetLastWin32Error());
}
}
私は何かのような音がします。ファイルが十分小さければメモリにコピーすることができますか? – strager
ええ、私たちは今やっていますが、たくさんのファイルがあり、3Mbから100Mbというかなり大きいサイズです。これは、多くのGCスラッシングを引き起こします。 –