我只是想知道,如果有人可以點我在正確的方向就到我應該怎麼走關於檢查文件是否存在?在這個時候,我打算繼續沿用以下方法:
if(NULL==(fp=fopen(filepath, "r"))){
我的最終目標是找到一個解決方案在bash替換此(就在文件中查找部分)
if ! (find /dev/shm/request-summon-*-$MCEXEC_PLAYERNAME.txt > /dev/null 2>&1); then
任何幫助非常感謝,謝謝!
我只是想知道,如果有人可以點我在正確的方向就到我應該怎麼走關於檢查文件是否存在?在這個時候,我打算繼續沿用以下方法:
if(NULL==(fp=fopen(filepath, "r"))){
我的最終目標是找到一個解決方案在bash替換此(就在文件中查找部分)
if ! (find /dev/shm/request-summon-*-$MCEXEC_PLAYERNAME.txt > /dev/null 2>&1); then
任何幫助非常感謝,謝謝!
請參閱stat()
的手冊頁,其中也涵蓋lstat()
和fstat()
。如果您得到-1作爲返回值,則您試圖獲取摘要信息的文件不存在,或者可能無權讀取(請參閱下面的最後一個示例,其中顯示與您的fopen()
測試的差異可能存在,但可能存在不讓你打開它)。
[email protected]:/tmp$ cat stat.c
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc > 1)
printf("Returned %d for %s\n", stat(argv[1]), argv[1]);
}
[email protected]:/tmp$ gcc -o stat stat.c
[email protected]:/tmp$ ./stat stat.c
Returned 0 for stat.c
[email protected]:/tmp$ ./stat does-not-exist
Returned -1 for does-not-exist
[email protected]:/tmp$ ./stat /root/.ssh/id_dsa ## exists, but I can't read it
Returned -1 for /root/.ssh/id_dsa
[email protected]:/tmp$
您有沒有一個標準的解決方案呢? – Shahbaz
Nop。 C不知道目錄,但你可以使用POSIX opendir/scandir來模擬你的'find'。 –
我會稱這相當標準。我從手冊頁中提到:「這些系統調用符合SVr4,4.3BSD,POSIX.1-2001。」 (並繼續詳細說明'stat'結構的結果可能會有所不同)。對於'存在測試'這是非常標準的。 –
使用stat()或lstat()。我個人更喜歡使用lstat(),因爲它告訴你目錄項是否是符號鏈接,而不是跟隨鏈接。
爲了您的最終目標,遍歷目錄樹。你可以用opendir()和readdir()來做到這一點。
在一個POSIX系統,你可以嘗試打開該文件,並檢查是否errno == ENOENT
如果失敗(返回NULL
):
if ((fp = fopen(path, "r")) == NULL)
if (errno == ENOENT)
// file doesn't exist
有這樣做的沒有純粹的ISO C方式。
使用stat
或lstat
也是可能的,但在stat
和文件的開口之間創建的文件時,可能導致race condition。
他應該檢查'ENOENT'。在評論中看到重複的問題。 – Shahbaz
@Shahbaz:錯字,好趕上! –
bash命令似乎相當錯位。你可以玩'shopt -s nullglob'並查看通配符的擴展是否爲空。見例如http://mywiki.wooledge.org/NullGlob – tripleee
@tripleee nullglob選項實際上已在bash腳本中使用過,但我正在尋找一種方法在C中執行此操作,而bash版本的工作原理恰好:) – lacrosse1991