2013-03-18 76 views
4

我的核心文件是通過附加到其名稱的pid生成的,或者有時只有名稱核心。我需要檢查名稱爲core.pidcore的文件是否存在。我曾嘗試使用stat(),其中我使用的路徑字符串爲/tmp/core*,但失敗。你能不能讓我知道如何解決這個問題。謝謝你的時間。如何檢查文件中是否存在c

+0

試試這個 [http://stackoverflow.com/questions/230062/whats-the-best-way-to-check-if-一個文件-存在-在-C-跨平臺] [1] [1]:http://stackoverflow.com/questions/230062/whats-the-best-way-to-check -if-a-file-exists-in-c-cross-platform – 2013-03-18 06:09:31

+0

@AkhilThayyil不相關,因爲「pid」是通配符。 – 2013-03-18 06:25:47

回答

1

你應該只是stat()兩個可能的名字,core.pidcore,看看是否有一個(或兩者)存在。

您嘗試stat()/tmp/core*表明您期望stat()接受shell glob模式。任何系統調用都不接受Shell glob模式。有一個C庫函數fnmatch它允許你解決它們,你可以使用它......但在這種情況下,因爲你只是檢查兩個不同的文件名,所以只需一次檢查它們就可以更容易和更高效。

編輯:如果你不事先知道實際的文件名,但你只知道它與core.開始,後面跟着一個數字,那麼你將不得不與opendir打開目錄,列舉中的所有文件它與readdir,並看看他們中的任何一個是否符合所需的模式(您可以使用fnmatch,或者只是手動解析它)。

+0

「core.pid」中的「pid」幾乎肯定代表任意數字。 – 2013-03-18 06:09:55

+0

@Celada但我怎麼知道PID值?它的coredump文件,每當一個進程崩潰。我需要檢查名爲core的文件是否附有pid。 – 2013-03-18 06:13:11

+0

@foo_l我明白了。對不起,我不清楚。 – Celada 2013-03-18 06:15:42

2

看起來像這樣一直是answered before。雖然stat()是可以接受的,如果你只檢查是否存在,我會用access()docs

+0

沒有人似乎得到(即使OP寫了「/ tmp/core *」)pid是一個進程ID,所以「core.pid」不是一個文字字符串。 – 2013-03-18 06:14:53

+1

不,您應該*不*使用'access()'來檢查文件的存在。其目的是使用調用進程的真實UID和GID **而不是有效的UID和GID來檢查對文件**的訪問。在setuid程序中檢查主叫用戶是否有權訪問文件很有用。對於使用有效的UID和GID(這是在嘗試真正打開文件時將使用的憑據)的正常訪問檢查,請使用'stat()'。 – Celada 2013-03-18 06:15:01

2

如果你只是想檢查一個新的文件是否已經出現,使用<dirent.h> API(opendir()readdir()等)在崩潰前後獲取相關目錄中的文件列表,然後比較兩個列表,以查看第二次檢查後是否有更多文件,如果是,則是哪一個。

0

我相信簡單的方法是使用fopen()。

FILE *fp; 

// fopen won't work on "r" mode if file doesn't exist 
fp = fopen("core.pid","r"); 

if(fp == NULL){ 
    // File doesn't exist 
    ... 
}else{ 
    // File does exist 
    ... 
} 
-1

如果第二個參數是F_OK,訪問只是簡單地檢查該文件的 存在。如果文件存在,則返回值爲0;如果不是, 返回值是-1,errno設置爲ENOENT。請注意,如果文件路徑中的目錄不可訪問,則errno可能會將 設置爲EACCES。

From the book "Advanced Linux Programming"

8

可以使用access功能:

if (0 == access(path, 0)) { 
    file exists; 
} 
else { 
    file does not exist; 
} 
+3

第二個訪問參數('0')的常量別名爲'F_OK' – JellicleCat 2016-01-25 20:56:23