2009-03-16 16 views
7

親フォルダの削除/名前変更を許可する方法でファイルを開くことはできますか?(本当に)ロックしていないファイルを開きますか?

私はあなたがこれを行うことができます知っている:

ファイルハンドルを閉じたときにファイルが削除されるのを許可します
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()); 
    } 
} 

答えて

0

私が思い付くことができる最高の解決策は、一時的なスクラッチの場所にファイルをコピーすることです。その後、一時ファイルを開いて、終了したら削除します。

+0

私は何かのような音がします。ファイルが十分小さければメモリにコピーすることができますか? – strager

+0

ええ、私たちは今やっていますが、たくさんのファイルがあり、3Mbから100Mbというかなり大きいサイズです。これは、多くのGCスラッシングを引き起こします。 –

0

FileOpenはKernel32.dllでCreateFileを使用します。 transactionとして実行しないかぎり、すべてのオプションが既に存在するため、.NETフレームワークが提供する以上のものを達成できるかどうかはわかりません。

+0

私は現在ドキュメントを釣っています。 CreateFileTransactedで開いたファイルが親フォルダの削除を許可しているか、それとも単にオプションとして提案しているのか分かりますか? –

+0

ファイルに2つのスレッドがあり、1つは開いていて、もう1つは同時に削除しようとしているとしますか? –

+0

最終的には、私はそれらのうちの1つのみを制御します。 –

1

NTFSで作業している場合、一時的な場所にあるファイルへの別のハードリンクを作成すると、ファイルのコピーオーバーヘッドを避けることができます。また、最初のリンクは削除可能(ファイル自体またはディレクトリ)を作成します。

+0

Hmmm、これは非常に有望だったようですが、親フォルダを削除してもエラーが表示されます。たぶん私は間違ったことをしているのかもしれないあなた自身でこれを試しましたか? –

+0

ハードリンクは元のファイルと同じである必要があります。つまり、実際にはファイルへの「メイン」ポインタの概念はなく、すべて同じです。 (それは別のディレクトリポインタを追加します)私はこの厳密な状況で個人的に使用していませんが、うまくいくはずです... – Eric

+0

私が追加したコードを見てください。 –

関連する問題