[筆記]同時讀取與寫入檔案C#

前情提要…
妹妹做一個專案吧
會有個感測器不斷讀取資料
然後要讀取資料,判讀數值,做些簡單的應用
但是
她對程式的熟悉程度
就像我以前剛進入學校、新環境那樣吧
而她現在主要是學設計的
該說很有野心呢?
還是很敢嘗試呢?

同時讀取與寫入檔案

這個範例專案,在GitHub

根據妹妹提出的想法
主要目的是看看
兩支程式如果想用檔案作為交流的內容
要如何做?
(如果用Background Task的方式去做
我也不熟悉,對她也太難了)

整個方案(Solution)中,有兩個專案 Write 與 Read
一個負責寫檔,一個負責讀檔。

專案結構

個別的主程式如下:

Write.Program

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void Main(string[] args)
{
string filePath = Path.Combine(Path.GetFullPath(Path.Combine($"{AppDomain.CurrentDomain.BaseDirectory}", "..\\..\\..\\..")), "files\\out.json");

using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read))
{
while (true)
{
var writer = new StreamWriter(file);
writer.WriteLine(DateTime.Now.ToLongTimeString());
writer.Flush();
Thread.Sleep(500);
}
}
}

Read.Program

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void Main(string[] args)
{
string filePath = Path.Combine(Path.GetFullPath(Path.Combine($"{AppDomain.CurrentDomain.BaseDirectory}", "..\\..\\..\\..")), "files\\out.json");

using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
while (true)
{
var reader = new StreamReader(file);
var line = reader.ReadLine();
Console.WriteLine(line);
Thread.Sleep(1000);
}
}
}
  • 共用的檔案預期會放在方案資料夾的根目錄下 <Solution Dir>\files\
    為了取得該檔案相對專案路徑,使用 AppDomain.CurrentDomain.BaseDirectory
    取得程式執行檔所在資料夾位置,再取得該檔案相對路徑。

  • 讀檔與寫檔,依據其目的,分別建立 FileStream 並給予不同的檔案存取與共用的權限
    Write要能寫,因此需要FileAccess.Write,並要讓Read同時也可以讀,設定FileShare.Read
    Read要能讀,因此需要FileAccess.Read,並要讓Write同時也可以寫,設定FileShare.ReadWrite

最後,
依序分別執行Write、Read
就可以看到效果了。


參考資料

  1. How to get my project path? - stackoverflow
  2. simultaneous read-write a file in C# - stackoverflow