Можно ли открыть файл таким образом, который позволяет впоследствии удалить/переименовать его родительскую папку?Открыть файл без (действительно) его блокировки?
Я знаю, что вы можете сделать это:
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. Это вызывает много хлопок ГК. –