在Linux下實現簡單的cp命令。這是《APUE》第四章的其中一道練習題。
其實思路很簡單,弄清規則就行了。規則1:原始檔必須得存在,否則出錯;規則2:目的檔案若不存在則建立,若存在,則提示是否覆蓋,是就覆蓋,不是就重新建一個。
下面給出程式碼:
/* 實現簡單的cp命令 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h> int my_cp(char *argv[]); int main(int argc, char *argv[]) /* argv[1]和argv[2]是檔案的路徑 */
{ my_cp(argv); return ;
} int my_cp(char *argv[]) /* 傳進來檔案的路徑 */
{
FILE *fp1, *fp2;
char ch;
char flag; /* 提示是否要覆蓋 */
char filename[]; if ((fp1 = fopen(argv[], "r")) == NULL) /* 原始檔必須得存在,否則出錯 */
{
printf("error:the %s doesn't exist.", argv[]);
exit();
} if ((fp2 = fopen(argv[], "r")) != NULL) /* 若檔案2已存在 */
{
printf("The file %s has been exist, cover? Y/N:", argv[]);
scanf(" %c", &flag); fclose(fp2); /* 因為下面無論是if還是else,都要重新開啟檔案,所以這裡先關掉 */ if (flag == 'y' || flag == 'Y') /* 覆蓋檔案2 */
{
if ((fp2 = fopen(argv[], "w")) == NULL)
{
printf("Cannot rewrite!");
exit();
}
while ((ch = fgetc(fp1)) != EOF)/* 將檔案1的內容複製到檔案2上 */
fputc(ch, fp2);
}
else /* 不覆蓋檔案2,新建一個檔案2 */
{
/* 命名檔案2為filename(1) */
strcpy(filename, argv[]);
strcat(filename, "-copy"); if ((fp2 = fopen(filename, "a")) == NULL)
{
printf("Cannot build the file %s.", filename);
exit();
}
while ((ch = fgetc(fp1)) != EOF)/* 將檔案1的內容複製到檔案2上 */
fputc(ch, fp2);
}
}
else /* 檔案2不存在,則建立 */
{
//fclose(fp2); /* 不應該要這句,因為前面用r模式開啟,要是不存在則會返回NULL指標,fclose(NULL)會出錯 */
if ((fp2 = fopen(argv[], "w")) == NULL)
{
printf("Cannot rewrite!");
exit();
}
while ((ch = fgetc(fp1)) != EOF)/* 將檔案1的內容複製到檔案2上 */
fputc(ch, fp2); } fclose(fp1);
fclose(fp2);
}
當目的檔案存在時,提示是否覆蓋:
當目的檔案不存在時,則建立:
不足之處:
1.只能支援一對一的複製,不能支援一對多的複製,這個可以改進。
2.因為是簡單的複製命令,所以並沒有引數可支援。