前情提要… 妹妹做一個專案吧 會有個感測器不斷讀取資料 然後要讀取資料,判讀數值,做些簡單的應用 但是 她對程式的熟悉程度 就像我以前剛進入學校、新環境那樣吧 而她現在主要是學設計的 該說很有野心呢? 還是很敢嘗試呢?
同時讀取與寫入檔案 這個範例專案,在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 就可以看到效果了。
參考資料
How to get my project path? - stackoverflow
simultaneous read-write a file in C# - stackoverflow