2011-04-13 48 views
0

我試圖創建5000個垃圾文件,將它們寫入文件並刪除它們。但是這段代碼只是將一部分文件寫入文件。 ls -l | grep^- | wc -l表示我有1598個文件保留在應該用unlink();清空的目錄中。如果我刪除關閉(fd),如果我執行超過1000個文件,則會發生seg故障。有什麼建議麼?試圖閱讀目錄的文件並將其寫入列表

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <sys/types.h> 
#include <dirent.h> 
#include <errno.h> 



main (int argv, char *args[]){ 
    if(argv<3){ 
     printf("Please run with proper command line arguements.\n"); 
     return; 
    } 
    int numFiles = atoi(args[1]); 
    char *fileName = args[2]; 
    char *fileList[numFiles]; 
    int x, ret,fd; 
    char buff[50]; 
    for(x=0;x<numFiles;x++){ 
     ret = sprintf(buff,"./stuff/%s-%d.junk",fileName, x); 
     fd = creat(buff); 
     close(fd); 
    } 
    DIR *odir = opendir("./stuff");   
    struct dirent *rdir = NULL; 
    FILE *fp; 
    fp = fopen("./files.list", "w"); 
    x=0; 
    while(rdir = readdir(odir)){ 
     char* name = rdir->d_name; 
     ret = sprintf(buff,"./stuff/%s-%d.junk",fileName, x); 
     if(strcmp(name,"..")!=0){ 
      if(strcmp(name,".")!=0){ 
       fprintf(fp,"%s %d\n",name,x); 
       x++; 
      } 
     } 
     unlink(buff); 
    } 
    close(fp); 
    closedir(odir); 
} 

謝謝!

注意:分配需要使用creat(),opendir(),readdir()和unlink()。至於錯誤檢查,當然,你的權利,但我在時間限制和電訊局長真的,真的不在乎......但謝謝大家!

+1

添加錯誤檢查,當返回錯誤時使用perror,然後返回更多有關失敗的信息,如果無法自行排除它爲什麼失敗。 – AProgrammer 2011-04-13 16:06:41

+0

不幸的是,我被分配使用creat(),opendir(),readdir()和unlink()。我喜歡被教導折舊的功能!現在我已經將unlink(buff)更改爲sprintf(buff,「./stuff/%s",name);取消鏈接(buff),一切正常。感謝您的幫助和建議! – Josh 2011-04-13 16:21:01

+0

檢查這些函數的結果,以確保它們的行爲正確,然後使用錯誤,如果它們沒有。 – AProgrammer 2011-04-13 16:25:41

回答

0

您正在從目錄中刪除東西,同時呼叫readdir;我認爲這應該工作正常,但你可能要考慮避免它。

更重要的是:當您用readdir遍歷目錄時,您可能會刪除readdir列出的不同文件。 (因爲你傳給unlink的是buff,你從穩步遞增的x中填入,而不是從readdir返回的任何東西。)所以,這裏有一個玩具的例子來說明爲什麼這是有問題的。假設該目錄包含文件1,2,3,4,並且readdir按照4,3,2,1的順序列出它們。

  • READDIR告訴你有關文件4.刪除文件1.
  • READDIR告訴你有關文件3.您刪除的文件2.
  • READDIR會告訴你有關文件2,但它的消失,因此沒有。
  • readdir會告訴你關於文件1的信息,但它沒有了。

最終文件3和4仍然在目錄中。

+0

顯然readdir應該正常工作,而文件被添加或從目錄中刪除,因爲沒有辦法保證某些_other_程序沒有這樣做。而且rm -r會如何工作?無論如何,關鍵是,sprintf調用應該是'sprintf(buff,「./ stuff /%s」,name)'。 – Random832 2011-04-13 16:16:40

+0

顯然它應該。但是,例如,不能保證在調用'opendir'之後添加或刪除的文件是否會被枚舉。是的,重點是被刪除的文件與'readdir'枚舉的文件不同,這就是我所說的。 – 2011-04-13 16:20:32

+0

這是保存當天的評論。謝謝:)) – Josh 2011-04-13 16:26:36

1

這裏,我們使用fopen

FILE *fp; 
fp = fopen("./files.list", "w"); 

但你正在使用close代替fclose將其關閉:

close(fp); 

我並不知道這是什麼導致你看到的問題,但它肯定是錯的。你可能只想要unlink(rdir->d_name)而不是unlink(buff)。您在創建文件時將編號嵌入到文件名中 - 當您讀取所創建文件的名稱時,不需要再次編號。

+0

是的,這是我通常會做的,不知道爲什麼我被分配使用其他功能。不過謝謝你! – Josh 2011-04-13 16:28:57

+0

@Josh Gilbertson:如果你被分配使用'close',那很好 - 但如果你打算,你需要使用匹配的'open'而不是'fopen'。 – 2011-04-13 17:08:00

相關問題