Có thể mở một tệp theo cách cho phép xóa/đổi tên thư mục mẹ sau đó không?Mở tệp mà không (thực sự) khóa nó?
Tôi biết bạn có thể làm điều này:
File.Open("foo.bar", FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete)
Mà sẽ cho phép các tập tin bị xóa khi tập tin xử lý được đóng lại. Tuy nhiên, nếu nó không cho phép thư mục cha bị xóa mà không có lỗi.
Tôi không thể tìm thấy bất kỳ thứ gì trong khuôn khổ. Tôi đã bỏ qua một cái gì đó, hoặc là có một API bản địa tôi có thể interop đến.
Lưu ý: Tôi không quan tâm nếu tôi có ngoại lệ khi sử dụng luồng của tệp đã xóa. Trong thực tế đó sẽ là lý tưởng.
UPDATE:
Vì vậy, ý tưởng hứa hẹn nhất là Hardlink, tuy nhiên tôi không thể làm cho nó làm việc. Tôi vẫn kết thúc với Truy cập bị từ chối khi tôi cố gắng xóa thư mục mẹ. Đây là mã của tôi:
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());
}
}
Nghe giống như điều tôi muốn làm. Có lẽ bạn có thể sao chép vào bộ nhớ nếu tệp đủ nhỏ? – strager
vâng, chúng tôi đang làm điều đó ngay bây giờ, nhưng có rất nhiều tập tin, và chúng là khá lớn 3Mb đến 100Mb. Nó gây ra rất nhiều cú đập GC. –