首頁  >  問答  >  主體

檔案鎖定 - C++ fstream 以ios::out|ios::in 方式開啟txt檔案,程式執行中記事本卻可以修改檔案?

C++ fstream 以ios::out|ios::in 方式開啟txt檔案,程式執行中記事本卻可以修改檔案,這是怎麼回事?

註: Win7 x64 ,帳號是Administrator 管理員帳號,沒有UAC,直接就是管理員.

#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char const *argv[]) {
    fstream file("test.txt",ios::in|ios::out);
    file.open("test.txt",ios::in|ios::out);
    char c;
    cin>>c;
    while(c!='X'){
        cin>>c;
        cout<<"Get a :"<<c<<endl;
    }
    return 0;
}

點完確定之後:出現另存為對話方塊,結果可以覆寫.

#程式還在運行中呢,檔案卻已經被修改了.

#原本直接用 sublimetext 是無法修改的,但經過記事本一折騰,現在sublimetext 也能修改了.


求教,如何能在程式運作過程中,禁止其他程式寫和刪除某個檔案,但是可以讀.

謝謝.###
世界只因有你世界只因有你2735 天前1084

全部回覆(2)我來回復

  • 我想大声告诉你

    我想大声告诉你2017-05-16 13:26:22

    先說你的問題:記事本覆蓋舊文件後,進程打開的文件是以前的文件(以前的文件還在,只不過你看不到了),你再次去編輯的文件已經是一個新的文件,

    在linux下面即使是強制性鎖也是可以繞開的,unlink就可以繞開,所以linux下是沒有辦法的避免這種問題,

    windows下面系統API應該提供了某些功能,不過我太了解,因為經常會發現:“該文件被進程佔用,無法刪除”, 但是不排除繞過這種限制

    回覆
    0
  • 高洛峰

    高洛峰2017-05-16 13:26:22

    這個問題還是比較有意思的.排查問題的思路可以是這樣的:

    1. 是不是檔案IO快取的問題?
      編輯器--系統緩衝區---實體檔案

    2. 是不是文件讀寫鎖的問題?
      (看到你的代碼雖然是以可讀可寫的方式打開文件,建立關聯,但是只用到了讀;讀鎖貌似不排他)

    回覆
    0
  • 取消回覆