2008-08-26 231 views
4

我必須開發一個應用程序來解析日誌文件並將特定數據發送到服務器。它必須在Linux和Windows上運行。C++:以非獨佔模式打開文件

當我想要測試日誌滾動系統(附加了.1到創建一個具有相同名稱的新名稱)的名稱時出現問題。在Windows上(還沒有在Linux上測試過),即使我在「輸入模式」(ios :: in)中打開它,我也無法重命名我用std :: ifstream()(獨佔訪問?)打開的文件。 。

是否有跨平臺的方式以非獨佔方式打開文件?

回答

3

有沒有辦法在一個非獨佔方式打開文件,

是的,使用Win32,通過各種FILE_SHARE_Xxxx標誌CreateFile時。

它是跨平臺嗎?

不,它需要特定於平臺的代碼。由於惱人的後向兼容性問題(DOS應用程序,是單一任務,假設沒有任何東西可以從它們下面刪除一個文件,也就是說它們可以在沒有任何問題的情況下fclose()然後fopen(); Win16保留這個假設使移植DOS應用程序變得更容易,Win32保留了這個假設,使得移植Win16應用程序變得更容易,而且很糟糕),Windows默認只打開文件。

底層操作系統基礎結構支持刪除/重命名打開的文件(儘管我相信它確實有內存映射文件無法刪除的限制,我認爲這不是限制* nix上的限制),但默認打開語義不。

C++沒有任何這方面的概念; C++操作環境與DOS操作環境非常相似 - 沒有其他應用程序同時運行,因此不需要控制文件共享。

1

這不是讀取操作需要獨佔模式,而是重命名,因爲這與將文件移動到新位置基本相同。

我不確定,但我不認爲這可以做到。請嘗試複製該文件,然後在不再讀取舊文件時刪除/替換舊文件。

1

Win32文件系統語義要求重命名的文件在重命名時不能打開(在任何模式下)。您將需要關閉文件,重命名它,然後創建新的日誌文件。

Unix文件系統語義允許您重命名打開的文件,因爲文件名只是指向inode的指針。

1

如果你只是從文件中讀取,我知道它可以用Windows API CreateFile來完成。只需指定FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE作爲dwShareMode的輸入。

不幸的是,這不是跨平臺的。但是Linux可能有類似的東西。

See msdn for more info on CreateFile

編輯:只是關於格雷格Hewgill評論的快速說明。我剛剛測試了FILE_SHARE *的東西(太100%肯定)。如果打開只讀並指定FILE_SHARE *參數,則可以在Windows中刪除和重命名文件。

0

我會確保你不要保持文件打開。例如,如果你的應用程序崩潰,這會導致怪異的東西。 我會做什麼:

  1. 摘要(讀/寫/翻身到一個新的文件)爲一類,而當你想翻轉到該類中的新安排文件關閉。 (這是最簡單的方法,因爲你已經有翻轉代碼,所以你已經到了一半了。)
  2. 如果你必須有多個讀/寫訪問點,需要fstreams的所有功能,並且不想寫完成一個包裝,那麼我能想到的唯一的跨平臺解決方案就是在不需要它的時候總是關閉文件,並且在需要時翻閱代碼嘗試獲取對文件的獨佔訪問次數在放棄之前翻身。