打开文件没有(真的)锁定它?

时间:2009-03-16 01:15:11

标签: c# .net interop

是否可以以允许后续删除/重命名其父文件夹的方式打开文件?

我知道你可以这样做:

File.Open("foo.bar", FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete)

允许在关闭文件句柄时删除文件。但是,如果它不允许删除父文件夹而没有错误。

我在框架中找不到任何东西。我是否忽视了某些内容,或者是否存在我可以互操作的原生API。

注意:在使用已删除文件的流时,我不在乎是否出现异常。事实上,这将是理想的。

更新

所以最有希望的想法是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());
    }
}

3 个答案:

答案 0 :(得分:1)

如果您正在使用NTFS,您可以在临时位置创建另一个文件的硬链接,您将避免文件复制开销,并且第一个链接仍应是可删除的(文件本身或包含目录)而不影响第二个。

答案 1 :(得分:0)

我能想出的最佳解决方案是将文件复制到临时临时位置。然后,打开临时文件,并在完成后将其删除。

答案 2 :(得分:0)

FileOpen在Kernel32.dll中使用CreateFile。我不确定你能否实现比.NET框架更多的功能,因为所有选项都已存在,除非你以transaction的形式执行。