2013-02-14 52 views
0

我有一個算法獲取的文件和文件大小,操作

掃描目錄中的所有文件(用C完成)

2.獲取的文件大小在迴路電流文件(用C完成)

如果小於8 KB的做一些事情,在數組存儲下一個即時的文件名(好像有在C關聯數組不支持)

我已經在PHP中完成了這項工作,但是由於無法預料的事件,現在需要用C語言編寫。我確實經歷了很多關於C的教程,並且誠實地說我低估了我認爲需要得到的時間基本的權利。

經過相當長的一段時間後,我設法讓我的手掌握列出目錄中文件的代碼。

#include <dirent.h> 
#include <stdio.h> 
#include <conio.h> 

int main(void) 
{ 
    char path = "D:\\ffmpeg\\bin\\frames\\"; 
    DIR   *d; 
    struct dirent *dir; 
    char test; 
    d = opendir("D:\\ffmpeg\\bin\\frames\\"); 
    if (d) 
    { 
    while ((dir = readdir(d)) != NULL) 
    {  
     printf("%s\n", dir->d_name); 
    } 

    closedir(d); 
    } 
    getchar(); 
    return(0); 
} 

現在很明顯,循環中的當前文件由dir->d_name表示。我卡住的東西是採取此並將其追加到"D:\\ffmpeg\\bin\\frames\\",使路徑變爲"D:\\ffmpeg\\bin\\frames\\somename.jpg"

這將幫助我獲得文件的直接路徑。一旦我得到,我將有所需的數據移動到第2步。我現在面臨的問題是字符串連接。我試過strcat(),但沒有成功。

所以基本上我要找的是

while ((dir = readdir(d)) != NULL) 
{  
    // merge "path" and "dir->d_name" to get something similar like 
    // "D:\\ffmpeg\\bin\\frames\\somename.jpg" 
} 

任何幫助,建議?

+4

爲什麼要提到PHP?你不會顯示你想要轉換的PHP代碼,所以它是不相關的。 – geoffspear 2013-02-14 12:21:02

+0

只是爲了防止一個PHP的人做了類似的事情可能會遇到這個..有人確實刪除了標籤..... – asprin 2013-02-14 12:21:59

回答

1

在純C推薦的解決方案是snprintf

char buf[MAX_PATH]; 
snprintf(buf, sizeof(buf), "%s%s", path, dir->d_name); 

不要使用strcat()strncat()

如果您使用的是MSVC,那麼您的C實現已過期24年,並且snprintf()不可用。您的選項是:

  1. 使用_snprintf()然後buf[sizeof(buf)-1] = '\0';作爲一種解決方法。

  2. 使用C++和std::string

  3. 使用Cygwin。

+0

使用固定大小的緩衝區是有問題的。這就是爲什麼在我的回答中我建議使用asprintf(),儘管我不確定MSVC支持它。當然,OP從不提及編譯器。 – mah 2013-02-14 12:26:49

+0

這確實奏效。另外,我不知道我在用什麼編譯器。雖然我知道我在使用Dev C++環境 – asprin 2013-02-14 12:28:16

+0

@mah:Windows上的路徑名具有最大長度。因此,固定大小的緩衝區在這種特殊情況下不成問題,因爲您可以只將緩衝區MAX_PATH變長。 – 2013-02-14 12:29:27

1

strcat()只有在您的字符串有足夠空間來保存結果時纔有效,並且會使目標無效,以便後續通過您的循環。

我會建議,而不是asprintf()函數,雖然它有一個小警告;它會分配你負責返回的內存。

while ((dir = readdir(d)) != NULL) 
{ 
    char *fullname; 
    asprintf(&fullname, "%s%s", "D:\\ffmpeg\\bin\\frames\\", dir->d_name); 
    printf("%s\n", fullname); 

    // now do things with `fullname` 

    free(fullname); // return the memory allocation at the end of the loop 
} 
+0

這可能是因爲我使用了錯誤的標題或者沒有包含它們而引發了一個錯誤。 – asprin 2013-02-14 12:27:17

+0

@asprin:這些標題可能不存在於您的系統上。 'asprintf()'是非標準的;它出現在Glibc和Linux等一些其他的。 – 2013-02-14 12:28:20

+0

啊..很有意義...我在Windows 7 – asprin 2013-02-14 12:29:16