2009-07-04 45 views
2

我知道標準C並沒有給我任何處理文件夾的能力,但我希望有一種相當便攜和跨平臺的方式來訪問文件夾。目前,我需要做的只是創建一個文件夾,檢查文件夾是否存在,並可能刪除一個文件夾。我可以預見在不久的將來需要從文件夾中讀取文件,但這不是一個迫切的需求。用於目錄訪問的C庫

無論如何,我想知道是否有一個很好的跨平臺C庫來處理目錄。在絕對捏的時候,我可能會推出自己的工作POSIX和Windows,但我想知道是否有任何好的已經出現在那裏。我一直在考慮GLib或Apache便攜式運行時,但這兩者都帶有比我真正需要的東西更多的東西,我希望保持相當輕量級。我還考慮過使用流行的腳本語言的內部函數,比如Perl或Python,但這對於目錄函數來說似乎也有很多開銷。

如果有人有任何要添加到此列表中的信息,我應該查看,或者想爲我已列出的某個選項做一個好例子,請告訴我。我不想聽起來像我要求代碼,但如果你發佈了一個簡單的函數,如int direxist(char *dirname),如果目錄存在返回true,否則返回false,只是爲了說明你選擇的庫的API,那將是真的真棒,我想不太難。如果你想主張使用POSIX /自己動手,那麼也要這樣做,因爲我自己就是這樣學習新東西的傻瓜。

只是爲了確保我想C而不是C++。我確信boost是好的,但我對C++解決方案不感興趣。

回答

3

我會跳上APR的潮流。它確實給了你更多的目錄訪問權限,但它是我使用過的最好的多平臺C庫。很有可能你會發現自己在未來需要其他一些組件,所以你不妨把它們放在方便的地方。

另一種選擇是通過Win32實現POSIX API,並將所有內容寫入POSIX。這裏的好處是,Windows正迅速成爲唯一不包含POSIX運行時實現的現代操作系統。

1

我一直在考慮GLib或Apache Portable Runtime,但是這兩者都有比我真正需要的東西多得多的東西,我想保持這個相當輕量級。

GLib很可能已經安裝(至少在GNU/Linux上)。唯一的問題是它會添加一個依賴項。

我還使用流行的腳本語言的內部,像Perl或Python考慮,但也似乎是一個很大的開銷只是目錄的功能。

我寧願首先使用Python,並可能使用C代碼的特定部分。

>>> def direxist(dirname): 
...  return os.path.isdir(dirname) 
... 
>>> direxist('/') 
True 
>>> direxist('/home') 
True 
>>> direxist('/home/bastien/Petites leçons de typographie.pdf') 
False 

關於編寫自己的C函數,它會去是這樣的:

#include <stdio.h> 

#ifdef _WIN32 
#include <windows.h> 
#else 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#endif 

int direxist(const char* dirname) 
{ 
#ifdef _WIN32 
    /* ... */ 
#else 
    struct stat fileinfo; 
    int ret = -1; 

    if (stat(dirname, &fileinfo) == -1) 
    { 
     perror("direxist"); 
    } 
    else 
    { 
     if (S_ISDIR(fileinfo.st_mode)) 
     { 
      ret = 1; 
     } 
     else 
     { 
      ret = 0; 
     } 
    } 

    return ret; 
#endif 
} 

int 
main (void) 
{ 
    printf("%d\n", direxist("/")); 

    return 0; 
} 

我不如何​​與Win32的做到這一點,所以你會發現你自己。

但是,我強烈建議使用外部庫。您不僅僅只是使用C庫或重新發明車輪。

+0

我在OS X,所以沒有免費的GLib我。我有時覺得自己像OS X操作系統是便攜的紅頭髮的繼子 - 儘管是非常接近POSIX,沒有人真的想太多了。我不想使用Python,因爲我不知道Python(還),我寧願將它寫在C(個人偏好)中。我不介意添加依賴項,但我想先了解我的選項。 – 2009-07-05 02:18:25

0

我想你應該在同樣使用APR或東西。設計一個POSIX API然後在windows上實現它並不適用於我的經驗(這是非常有限的,我必須承認)。

文件IO,以及相關的語義實在太不同,所以你要設計你的API馬上處理窗口。在公共API中可以放置什麼也有不同的限制。這種問題的一個例子是用於文件處理的python C API。這顯然是設計與POSIX POV,這是非常困難的使用它,因爲類似的事情分享Ç窗口運行時將對象等等......