Saya memiliki layanan windows menulis log-nya dalam file teks dalam format sederhana.
Sekarang, saya akan membuat aplikasi kecil untuk membaca log layanan dan menampilkan log yang ada dan yang ditambahkan sebagai tampilan langsung.
Masalahnya adalah layanan mengunci file teks untuk menambahkan baris baru dan pada saat yang sama aplikasi penampil mengunci file untuk dibaca.
Kode Layanan:
void WriteInLog(string logFilePath, data)
{
File.AppendAllText(logFilePath,
string.Format("{0} : {1}\r\n", DateTime.Now, data));
}
Kode Penampil:
int index = 0;
private void Form1_Load(object sender, EventArgs e)
{
try
{
using (StreamReader sr = new StreamReader(logFilePath))
{
while (sr.Peek() >= 0) // reading the old data
{
AddLineToGrid(sr.ReadLine());
index++;
}
sr.Close();
}
timer1.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void timer1_Tick(object sender, EventArgs e)
{
using (StreamReader sr = new StreamReader(logFilePath))
{
// skipping the old data, it has read in the Form1_Load event handler
for (int i = 0; i < index ; i++)
sr.ReadLine();
while (sr.Peek() >= 0) // reading the live data if exists
{
string str = sr.ReadLine();
if (str != null)
{
AddLineToGrid(str);
index++;
}
}
sr.Close();
}
}
Apakah ada masalah dalam kode saya dalam membaca dan menulis?
Bagaimana cara mengatasi masalah tersebut?
Jawaban:
Anda perlu memastikan bahwa layanan dan pembaca membuka file log secara non-eksklusif. Coba ini:
Untuk layanan - penulis dalam contoh Anda - gunakan
FileStream
instance yang dibuat sebagai berikut:var outStream = new FileStream(logfileName, FileMode.Open, FileAccess.Write, FileShare.ReadWrite);
Untuk pembaca gunakan yang sama tetapi ubah akses file:
var inStream = new FileStream(logfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Juga, karena
FileStream
penerapanIDisposable
pastikan bahwa dalam kedua kasus Anda mempertimbangkan untuk menggunakanusing
pernyataan, misalnya untuk penulis:using(var outStream = ...) { // using outStream here ... }
Semoga berhasil!
sumber
FileStream
mengimplementasikanIDisposable
Atur mode berbagi secara eksplisit saat membaca file teks.
using (FileStream fs = new FileStream(logFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (StreamReader sr = new StreamReader(fs)) { while (sr.Peek() >= 0) // reading the old data { AddLineToGrid(sr.ReadLine()); index++; } } }
sumber
new StreamReader(File.Open(logFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
-> ini tidak mengunci file.
sumber
Masalahnya adalah ketika Anda menulis ke log Anda secara eksklusif mengunci file tersebut sehingga StreamReader Anda tidak akan diizinkan untuk membukanya sama sekali.
Anda perlu mencoba membuka file dalam mode hanya baca .
using (FileStream fs = new FileStream("myLogFile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (StreamReader sr = new StreamReader(fs)) { while (!fs.EndOfStream) { string line = fs.ReadLine(); // Your code here } } }
sumber
File.ReadAllText()
gagal dengan mode hanya-baca.UnauthorizedAccessException
jika file hanya baca - pasti melewatkannya pada saat menjawab!Saya ingat melakukan hal yang sama beberapa tahun lalu. Setelah beberapa pertanyaan google saya menemukan ini:
FileStream fs = new FileStream(@”c:\test.txt”, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
yaitu menggunakan atribut FileShare.ReadWrite di FileStream ().
(ditemukan di blog Balaji Ramesh )
sumber
Sudahkah Anda mencoba menyalin file, lalu membacanya?
Cukup perbarui salinan setiap kali ada perubahan besar.
sumber
Metode ini akan membantu Anda membaca file teks tercepat dan tanpa menguncinya.
private string ReadFileAndFetchStringInSingleLine(string file) { StringBuilder sb; try { sb = new StringBuilder(); using (FileStream fs = File.Open(file, FileMode.Open)) { using (BufferedStream bs = new BufferedStream(fs)) { using (StreamReader sr = new StreamReader(bs)) { string str; while ((str = sr.ReadLine()) != null) { sb.Append(str); } } } } return sb.ToString(); } catch (Exception ex) { return ""; } }
Semoga metode ini bisa membantu Anda.
sumber