2013-02-02 20 views
1

我正在創建一個列出目錄內容的簡單C程序。有誰知道如何只列出隱藏?下面的代碼從目錄中提取每個文件並且工作完美,但我只需要隱藏的文件。謝謝。用於列出隱藏和只讀文件的C程序

+2

短語 「隱藏文件」 幾乎是毫無意義的。它基本上意味着「那些名稱不在默認情況下使用任何工具打印名稱的文件」。一個常見的慣例是禁止以'。'開頭的名字,但是如果您正在編寫打印名稱的軟件,那麼您可以決定什麼是「隱藏文件」。 –

回答

6

在GNU/Linux上,隱藏文件以點開頭。

#include <string.h> 

int is_hidden(const char *name) 
{ 
    return name[0] == '.' && 
     strcmp(name, ".") != 0 && 
     strcmp(name, "..") != 0); 
} 

要檢查文件是隻讀的,也可能是使用stat功能是個好主意。

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

int is_readonly(const char *name) 
{ 
    struct stat buf; 

    stat(name, &buf); 

    return buf->st_mode & /* ... */; 
} 
+0

哇,你太棒了!謝謝! –

+0

正如上面的評論所解釋的,「隱藏文件」實際上是一個shell/ls約定。 – vonbrand

3
  • 決定一個文件是「隱藏」的檢查,如果它的名字用.
  • 開始決定,如果一個文件是隻讀的,做一個stat(2)和檢查權限(st_mode

或者,對於第二點,如果您小心,可以使用access(2)。如果你想open(2)那個文件,你不應該相信access(2)返回。一般要避免access(2)

+0

避免訪問的原因是TOCTOU(檢查時間/使用時間)類型的問題:您檢查某件事物,有人偷偷進入並更改它,然後您依賴收集的(現在已過時的)數據。如果你只是檢查,這不是一個問題。 – vonbrand

-2

下面的代碼片段將幫助您檢查文件是否在Windows中隱藏。

int is_hiddenfile(char* file_name) 
{ 
    FILE * batch_file = NULL; 
    FILE * output_file = NULL; 
    int count = 0; 
    batch_file = fopen ("D:\\bat.bat", "w"); 
    fputs ("dir /ah ", batch_file); 
    fputs (file_name, batch_file); 
    fputs (" 2>D:\\out.txt", batch_file); 
    fclose (batch_file); 
    ShellExecuteA (NULL, "open", "D:\\bat.bat", NULL, NULL, SW_SHOWNORMAL); 
    output_file = fopen("D:\\out.txt", "r"); 
    while(feof(output_file) == 0) 
    { 
     fgetc(output_file); 
     count++; 
    } 
    if (count <= 1) 
     return 1; 
    else 
     return 0; 
} 

要檢查文件是否在窗口只讀與否,/ar需要dir命令用來代替/ah

int is_readonlyfile(char* file_name) 
{ 
    ... //same as is_hiddenfile function 
    fputs ("dir /ar ", batch_file); 
    ... //same as is_hiddenfile function 
} 
+0

這個問題被標記爲* Linux *,您的答案不適用於Linux。 –

+0

不僅如此,而且建議在D盤的根目錄創建一個名爲'bat.bat'的新文件(用戶是否有這樣的驅動器和寫入權限?誰知道?)調用shell' dir「命令詢問隱藏文件並尋找正在尋找的文件,將輸出傳送到名爲」out.txt「的文件,然後檢查它是否包含內容。然後它將批處理文件和管道輸出文件都保留在原位。所以這是一個非常複雜的查詢方式,甚至不一定會奏效。 – Tommy

1

要檢查文件是否爲只讀或沒有,你可以用sys/stat.h(參考:http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/stat.h.html

所有你需要做的是執行上ST_MODE &(二進制和)操作。

struct stat st; 

if (stat(fileName, &st) == 0) 
    cout << " user write permission: " << (st.st_mode & 00200) ; 

如果輸出爲0,則用戶無權寫入(只讀)。否則,該文件不是隻讀的。

其他權限位:

 S_IRWXU  00700 mask for file owner permissions 
     S_IRUSR  00400 owner has read permission 
     S_IWUSR  00200 owner has write permission 
     S_IXUSR  00100 owner has execute permission 
     S_IRWXG  00070 mask for group permissions 
     S_IRGRP  00040 group has read permission 
     S_IWGRP  00020 group has write permission 
     S_IXGRP  00010 group has execute permission 
     S_IRWXO  00007 mask for permissions for others 
          (not in group) 
     S_IROTH  00004 others have read permission 
     S_IWOTH  00002 others have write permission 
     S_IXOTH  00001 others have execute permission 
+0

謝謝,這個信息很有幫助。 – reformed