2011-06-08 72 views
2

在C++中,我想打開一個文件並設置其權限,但是失敗了。下面是我的程序:如何在C++中打開文件時設置文件權限?

string filename="test.cnf"; 
ofstream ofile; 
ofile.open(filename.c_str(),O_RDONLY); 
ofile.close() 

,但我得到了以下錯誤:

error: invalid conversion from 'int' to 'std::_Ios_Openmode' 

error: initializing argument 2 of 'void std::basic_ofstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]' 

如何設置文件,如644,700的許可?

回答

4

fstream沒有O_RDONLY模式。您應該使用的一個:

  1. ios::app
  2. ios::binary
  3. ios::ate
  4. ios::in
  5. ios::out
  6. ios::trunc

或其combinati (例如ios::app | ios::binary)。對於你的情況,你應該使用ios::in(也許與ios::binary)。查看this瞭解更多詳情。

+0

非常感謝您的快速回復。這對我清除我的錯誤非常有幫助。 – zhaojing 2011-06-08 09:18:08

+0

這隻能處理第一部分 – UpAndAdam 2013-10-17 19:34:14

+0

這並沒有說明分配給文件的權限,也沒有什麼幫助。 – 2016-08-04 17:30:14

2

如果你在unix系統上,你需要的是「setmode」或「getmode」函數。

從你的shell命令行中鍵入「人setmode」

+1

我不認爲'setmode'或'getmode'與OP的問題有什麼關係。 – 2011-06-08 05:57:22

+0

同意@Billy。 @malkia OP有'std :: ofstream'的問題,但你告訴他如何解決這個問題,如果它是關於'FILE *'的。 – 2011-06-08 06:54:05

+0

謝謝大家!是的,我的問題與std:ofstream有關。但你的方法給我另一種方式,謝謝! – zhaojing 2011-06-08 09:19:29

7

你似乎要指定(O_RDONLY)的選項不是 「許可」,這是一個訪問模式。在O_WRONLYO_RDWRin | out in單獨導致O_RDONLYout單獨:這些是根據 到的std::ios_base::instd::ios_base::out組合設置隱式。

對於創建的文件的權限,答案是,相當煩人, 你不能指定它們。 std::filebuf::open()(這是什麼 std::ifstreamstd::ofstream最終調用)沒有選項或 條款傳遞任何權限的指示將被使用,如果它 必須創建該文件。
做到這一點的唯一方法是通過使用你的系統級功能(open Linux下,CreateFile的Windows —下,儘管名字,open 可以創建一個文件,並CreateFile將打開現有的文件,而 創建任何東西)。然而,使用系統級open/CreateFile,但是, 表示使用系統級read/ReadFilewrite/WriteFile

+0

感謝您的回答,這很有幫助。但我必須選擇第一個人作爲接受人,因爲他很快。對不起:-) – zhaojing 2011-06-08 09:32:01

+0

@趙靖你應該選擇接受的答案是最正確的/是最好的答案。不要緊,哪一個先到先得 – UpAndAdam 2013-10-17 19:36:02

1
  1. fstream的::開放的第二個參數是在IOS ::應用程序,IOS ::二進制,IOS ::選擇標誌的組合吃,IOS ::在,IOS ::出來,IOS :: TRUNC。

  2. 沒有標準的C++接口來設置訪問權限。我知道的實現是使用0666,然後由umask(2)設置的值屏蔽。這也是unix應用程序的常見行爲(umask從父項繼承,shell具有內置umask命令)。我的建議是,你什麼都不做,依靠用戶設置的umask。如果不適用,請臨時更改應用中的umask。

+0

謝謝你的不錯答案,這讓我很清楚! – zhaojing 2011-06-08 09:30:25