Открыть файл без (действительно) блокировки? - PullRequest
7 голосов
/ 16 марта 2009

Можно ли открыть файл таким образом, чтобы можно было впоследствии удалить / переименовать его родительскую папку?

Я знаю, что вы можете сделать это:

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());
    }
}

Ответы [ 3 ]

1 голос
/ 16 марта 2009

Если вы работаете с NTFS, вы можете создать другую жесткую ссылку на файл во временном расположении, вы избежите накладных расходов при копировании файла, и первая ссылка все равно должна быть удаляемой (либо сам файл, либо содержащий каталог). ) без воздействия на второе.

0 голосов
/ 16 марта 2009

FileOpen использует CreateFile в Kernel32.dll. Я не уверен, что вы сможете достичь чего-то большего, чем предоставляет .NET Framework, поскольку все опции уже есть, если вы не выполните это как транзакция .

0 голосов
/ 16 марта 2009

Лучшее решение, которое я могу придумать, - это скопировать файл во временную папку. Затем откройте временный файл и удалите его, когда я закончу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...