Ứng dụng web của tôi trả về tệp từ hệ thống tệp. Những tệp này là động, vì vậy tôi không có cách nào để biết tên của chúng. Khi tệp này không tồn tại, ứng dụng sẽ tạo nó từ cơ sở dữ liệu. Tôi muốn tránh rằng hai luồng khác nhau tạo lại cùng một tệp cùng một lúc hoặc một chuỗi cố gắng trả về tệp trong khi luồng khác đang tạo tệp đó.Cách khóa tệp và tránh đọc trong khi đang viết
Ngoài ra, tôi không muốn bị khóa trên phần tử phổ biến cho tất cả các tệp. Vì vậy, tôi nên khóa tập tin chỉ khi tôi đang tạo nó.
Vì vậy, tôi muốn khóa tệp cho đến khi quá trình giải trí hoàn tất, nếu chủ đề khác cố gắng truy cập vào nó ... nó sẽ phải đợi tệp được mở khóa.
Tôi đã đọc về FileStream.Lock, nhưng tôi phải biết độ dài tệp và nó sẽ không ngăn chặn chủ đề khác cố gắng đọc tệp, vì vậy nó không hoạt động cho trường hợp cụ thể của tôi.
Tôi cũng đã đọc về FileShare.None, nhưng nó sẽ ném một ngoại lệ (loại ngoại lệ?) Nếu chuỗi/quá trình khác cố gắng truy cập tệp ... vì vậy tôi nên phát triển "thử lại trong khi "bởi vì tôi muốn tránh thế hệ ngoại lệ ... và tôi không thích quá nhiều cách tiếp cận đó, mặc dù có thể không có cách nào tốt hơn.
Cách tiếp cận với FileShare.None sẽ này nhiều hay ít:
static void Main(string[] args)
{
new Thread(new ThreadStart(WriteFile)).Start();
Thread.Sleep(1000);
new Thread(new ThreadStart(ReadFile)).Start();
Console.ReadKey(true);
}
static void WriteFile()
{
using (FileStream fs = new FileStream("lala.txt", FileMode.Create, FileAccess.Write, FileShare.None))
using (StreamWriter sw = new StreamWriter(fs))
{
Thread.Sleep(3000);
sw.WriteLine("trolololoooooooooo lolololo");
}
}
static void ReadFile()
{
Boolean readed = false;
Int32 maxTries = 5;
while (!readed && maxTries > 0)
{
try
{
Console.WriteLine("Reading...");
using (FileStream fs = new FileStream("lala.txt", FileMode.Open, FileAccess.Read, FileShare.Read))
using (StreamReader sr = new StreamReader(fs))
{
while (!sr.EndOfStream)
Console.WriteLine(sr.ReadToEnd());
}
readed = true;
Console.WriteLine("Readed");
}
catch (IOException)
{
Console.WriteLine("Fail: " + maxTries.ToString());
maxTries--;
Thread.Sleep(1000);
}
}
}
Nhưng tôi không thích thực tế là tôi phải bắt ngoại lệ, hãy thử nhiều lần và chờ đợi một khoản tiền không chính xác của thời gian: |
FileShare.None thay vì FileAccess.None (FileAccess xác định quyền truy cập ứng dụng của bạn, trong khi FileShare được sử dụng để khóa tệp, như bạn muốn) – jpabluz
Về chủ đề khác, hãy nhớ mở khóa tệp bất cứ khi nào ứng dụng của bạn bị phá hủy , Tôi ghét khi khóa vẫn còn sau đó. – jpabluz
Tôi đã chỉnh sửa và sửa nó, cảm ơn! – vtortola