Antwort
einfach sperren öffnet ausschließlich:
using (FileStream fs =
File.Open("MyFile.txt", FileMode.Open, FileAccess.Read, FileShare.None))
{
// use fs
}
Ref.
Update: Als Reaktion auf einen Kommentar vom Plakat: Nach der Online-Version MSDN doco, File.Open wird in .Net Compact Framework 1.0 und 2.0 unterstützt.
Und während du schon dabei bist, machen sicher, dass Sie die Referenz nicht verlieren und die Entsperrung verzögern, bis der GC sie nichtdeterministisch freigibt - verwenden Sie die IDisposable-Schnittstelle, indem Sie beispielsweise die obige Anweisung in einen 'using'-Block einschließen. –
Nicht sicher, dass dies die Frage beantwortet. OP sucht nach der FileStream.Lock-Methode, die im kompakten Framework nicht existiert. Sperren verhindert, dass andere Prozesse die Datei ändern, sie können sie jedoch weiterhin lesen. Ich denke, Ihre Methode würde andere Prozesse komplett blockieren. – MusiGenesis
@MusiGenesis: Das Poster scheint zu fragen, wie man eine Datei sperren kann ... –
Dies entspricht der Antwort von Mitch, außer dass es in weiteren Versionen von .Net verfügbar zu sein scheint. Das einzige signifikante Argument ist FileShare.None
; die anderen ermöglichen diese Überladung des Konstruktors, aber ihre Werte werden durch die Verwendung des Streams bestimmt.
using(var fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None)
{
// ...
}
FileShare.NONE würde einen „System.IO.IOException“ Fehler auslösen, wenn ein anderer Thread auf die Datei zuzugreifen versucht.
Sie könnten eine Funktion verwenden, die try/catch verwendet, um auf die Freigabe der Datei zu warten. Beispiel here.
Oder Sie könnten eine Sperre Aussage mit einigen „Dummy“ Variable verwenden, bevor die Schreibfunktion zuzugreifen:
// The Dummy Lock
public static List<int> DummyLock = new List<int>();
static void Main(string[] args)
{
MultipleFileWriting();
Console.ReadLine();
}
// Create two threads
private static void MultipleFileWriting()
{
BackgroundWorker thread1 = new BackgroundWorker();
BackgroundWorker thread2 = new BackgroundWorker();
thread1.DoWork += Thread1_DoWork;
thread2.DoWork += Thread2_DoWork;
thread1.RunWorkerAsync();
thread2.RunWorkerAsync();
}
// Thread 1 writes to file (and also to console)
private static void Thread1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 20; i++)
{
lock (DummyLock)
{
Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss") + " - 3");
AddLog(1);
}
}
}
// Thread 2 writes to file (and also to console)
private static void Thread2_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 20; i++)
{
lock (DummyLock)
{
Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss") + " - 4");
AddLog(2);
}
}
}
private static void AddLog(int num)
{
string logFile = Path.Combine(Environment.CurrentDirectory, "Log.txt");
string timestamp = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss");
using (FileStream fs = new FileStream(logFile, FileMode.Append,
FileAccess.Write, FileShare.None))
{
using (StreamWriter sr = new StreamWriter(fs))
{
sr.WriteLine(timestamp + ": " + num);
}
}
}
Sie können auch die „Sperre“ Anweisung in der eigentlichen Schreibfunktion verwenden selbst (dh innerhalb AddLog) anstatt in den Funktionen des Hintergrundarbeiters.
Dies könnte zu Dutzenden von verschiedenen Antworten führen, die alle gültig wären. Bitte fügen Sie weitere Einzelheiten hinzu. (Übrigens könnte die bloße Angabe der Datei schon einige andere davon abhalten, darauf zuzugreifen.) –
Setzen Sie den Schlüssel ein und drehen Sie ihn nach links. –
Das funktionierte für mich http://stackoverflow.com/questions/4692981/c-sharp-blocking-a-folder-from-in-change-while-processing/4693064#4693064 – Vbp