#include #include #include #include #include #include #include #include #define BUFFER_SIZE 512 int main(int argc, char *argv[]) { int fdr,fdw; /* 文件描述符 fdr->源文件 fdw->目標文件 */ char buffer[BUFFER_SIZE]; /* 定義緩衝區 */ int cntr, cntw; char *ptr; char FileName[20]; /* 得到要複製文件名 */ if(argc < 2) { printf("輸入要複製文件名: "); exit(1); } /*只讀方式打開源文件*/ fdr = open(argv[1], O_RDONLY); if(fdr < 0) { perror("Open fdr failed"); exit(-1); } /* 扗載U盤至/mnt目錄 */ if(system("mount /dev/sda1 /mnt") < 0) { printf("mount USB failed\n"); exit(0); } sprintf(FileName,"/mnt/%s",argv[1]); /*以寫的方式打開文件,若是文件不存在則建立,其權限 可讀寫*/ fdw = open(FileName, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); if(fdw < 0) { perror("Open fdw failed"); exit(-1); } /* 文件拷貝 */ while((cntr = read(fdr, buffer, BUFFER_SIZE)) != 0) /* 讀文件 */ { if(cntr < 0) /*文件讀取是否出錯*/ { perror("read error"); break; } else if(cntr > 0) /* 讀取文件成功,數據長度爲cntr*/ { ptr = buffer; while((cntw = write(fdw, ptr, cntr)) != 0) /* 將讀取的長度寫入到目標文件中 */ { if(cntw < 0) /*文件讀取是否出錯*/ { perror("write error"); break; } else if(cntr == cntw) /* 寫入字節和讀取字節相同,數據所有寫入 */ break; else if(cntw > 0) /* 寫入字節小於讀取字節,只有部分數據寫入 */ { ptr += cntw; /* 指向未寫入的數據,接下來再次執行寫入操做 */ cntr -= cntw; } } if(cntw < 0) /*文件讀取是否出錯*/ { perror("write error"); break; } } } /* 關閉文件 */ close(fdr); close(fdw); /* 制載U盤至/mnt目錄 */ if(system("umount /mnt") < 0) { printf("umount USB failed\n"); exit(0); } printf(" Done!\n"); return 0; }