2013-06-22 123 views
0

我正在處理重命名或刪除文件系統中的文件的程序。我使用C,它在Linux機器上運行良好,但在Windows上失敗。我使用gcc編譯器套裝。以下是它不會從我的文件系統中刪除文件的代碼。如何刪除和重命名Windows上的C文件

在此先感謝

#include<stdio.h> 

int main() 
{ 
printf("Program demonstrating file renaming and file deletion. \n"); 

printf("Enter file name to be deleted : "); 
char fdelete[25]; 

fflush(stdin); 

gets(fdelete); 

printf("Enter file name to be renamed : "); 
char frename[25]; 

fflush(stdin); 

gets(frename); 

if (remove(fdelete)!=0) 
{ 
    printf("error deleting the file.\n"); 
} 

if(rename("test2.txt",frename)!=0) //test2.txt is the original file 
{ 
    printf("eeror renaming the file.\n"); 
} 

return 0; 
} 
+2

我感到一個尷尬的衝動,利用您的程序中的緩衝區溢出漏洞獲得對您的計算機的根訪問權限。換句話說,'gets(fdelete);' - >'fgets(fdelete,sizeof(fdelete),stdin);'。另外,不要命名你的變量'fdelete'。它看起來像是一個理論上的C stdlib函數,它刪除了一個'FILE *'。將它命名爲「buf」(它是一個緩衝區)。 – 2013-06-22 20:49:40

+2

您是否嘗試過查看'errno'來查看失敗操作的錯誤代碼是什麼?一切都很好,並且可以說有問題,但是當你能夠說出問題的原因時,這是無用的。 '錯誤刪除文件:$ errno'類型的東西。 –

+0

重命名文件的最佳做法可能取決於您的目標操作系統。可能想將其添加到標籤。 – jpaugh

回答

1

代碼有很多問題。

char fdelete[25]; 

這可能是至少接近可以接受的20年前,但現在超過25個字符的文件名的機會都長相當高。您可能想要使用FILENAME_MAX

fflush(stdin); 

這(調用fflush一個文件打開輸入作爲其參數)給出未定義的行爲。只是不要這樣做。

gets(fdelete); 

gets是一個嚴重的安全問題。切勿使用它。改爲使用fgets

char frename[25]; 

fdelete一樣的問題。

fflush(stdin); 
gets(frename); 

與上述相同的問題。

所有這一切,remove應該刪除一個文件,提供沒有其他鏈接到該文件,並傳遞給它的名稱是一個實際文件的名稱。