我的核心文件是通過附加到其名稱的pid生成的,或者有時只有名稱核心。我需要檢查名稱爲core.pid
或core
的文件是否存在。我曾嘗試使用stat()
,其中我使用的路徑字符串爲/tmp/core*
,但失敗。你能不能讓我知道如何解決這個問題。謝謝你的時間。如何檢查文件中是否存在c
回答
由於您使用Linux,你可以使用
http://man7.org/linux/man-pages/man3/glob.3.html
水珠會讀取目錄並返回匹配的模式,這就是你想要的名稱的列表。
您也可能想要使用http://man7.org/linux/man-pages/man7/inotify.7.html來更改時只讀取該目錄。
你應該只是stat()
兩個可能的名字,core.pid
和core
,看看是否有一個(或兩者)存在。
您嘗試stat()
/tmp/core*
表明您期望stat()
接受shell glob模式。任何系統調用都不接受Shell glob模式。有一個C庫函數fnmatch它允許你解決它們,你可以使用它......但在這種情況下,因爲你只是檢查兩個不同的文件名,所以只需一次檢查它們就可以更容易和更高效。
編輯:如果你不事先知道實際的文件名,但你只知道它與core.
開始,後面跟着一個數字,那麼你將不得不與opendir打開目錄,列舉中的所有文件它與readdir,並看看他們中的任何一個是否符合所需的模式(您可以使用fnmatch
,或者只是手動解析它)。
「core.pid」中的「pid」幾乎肯定代表任意數字。 – 2013-03-18 06:09:55
@Celada但我怎麼知道PID值?它的coredump文件,每當一個進程崩潰。我需要檢查名爲core的文件是否附有pid。 – 2013-03-18 06:13:11
@foo_l我明白了。對不起,我不清楚。 – Celada 2013-03-18 06:15:42
看起來像這樣一直是answered before。雖然stat()
是可以接受的,如果你只檢查是否存在,我會用access()
(docs)
沒有人似乎得到(即使OP寫了「/ tmp/core *」)pid是一個進程ID,所以「core.pid」不是一個文字字符串。 – 2013-03-18 06:14:53
不,您應該*不*使用'access()'來檢查文件的存在。其目的是使用調用進程的真實UID和GID **而不是有效的UID和GID來檢查對文件**的訪問。在setuid程序中檢查主叫用戶是否有權訪問文件很有用。對於使用有效的UID和GID(這是在嘗試真正打開文件時將使用的憑據)的正常訪問檢查,請使用'stat()'。 – Celada 2013-03-18 06:15:01
如果你只是想檢查一個新的文件是否已經出現,使用<dirent.h>
API(opendir()
,readdir()
等)在崩潰前後獲取相關目錄中的文件列表,然後比較兩個列表,以查看第二次檢查後是否有更多文件,如果是,則是哪一個。
我相信簡單的方法是使用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
...
}
如果第二個參數是F_OK,訪問只是簡單地檢查該文件的 存在。如果文件存在,則返回值爲0;如果不是, 返回值是-1,errno設置爲ENOENT。請注意,如果文件路徑中的目錄不可訪問,則errno可能會將 設置爲EACCES。
可以使用access
功能:
if (0 == access(path, 0)) {
file exists;
}
else {
file does not exist;
}
第二個訪問參數('0')的常量別名爲'F_OK' – JellicleCat 2016-01-25 20:56:23
- 1. 如何檢查文件夾中是否存在文件C
- 2. 如何在C#中使用「Environment.UserName」檢查文件是否存在?
- 3. C檢查文件是否存在
- 4. 如何檢查文件是否存在文件擴展名? C#
- 5. 如何檢查文件是否存在
- 6. 如何檢查文件是否存在?
- 7. 如何檢查文件是否存在?
- 8. 如何檢查文件是否存在?
- 9. 如何檢查文件是否存在
- 10. 如何檢查Cocoa&Objective-C中是否存在文件夾?
- 11. 如何檢查文件是否存在打開在EXE C++
- 12. 如何檢查.config文件是否存在或不在C#文件夾中?
- 13. 如何檢查文件夾中是否已存在文件
- 14. 如何檢查chm文件中是否存在子文件?
- 15. 如何檢查文件夾中是否存在文件?
- 16. 如何檢查zip文件中是否存在文件
- 17. 如何檢查文件是否存在於war文件中?
- 18. 如何檢查文件是否存在從C#或Javascript?
- 19. 如何用C++檢查Qt文件是否存在
- 20. 如何檢查序列化後文件是否存在 - C#?
- 21. 檢查JList中是否存在文件
- 22. 檢查Yii中是否存在文件
- 23. 檢查文件中是否存在行
- 24. 如何檢查文件是否是C++中的常規文件?
- 25. 如何檢查Firebase存儲中是否存在文件?
- 26. 檢查文本文件中是否存在單詞C++
- 27. 如何檢查子文件夾文本文件是否存在
- 28. 如何檢查Swift文檔目錄中是否存在文件?
- 29. 如何檢查MATLAB中的文本文件是否存在
- 30. 如何檢查nsfilemanager中是否存在任何現有文件?
試試這個 [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
@AkhilThayyil不相關,因爲「pid」是通配符。 – 2013-03-18 06:25:47