2017-04-26 96 views
0

我正在嘗試複製程序。它類似於linux中的cp函數。我可以使用./copy file1 file2成功複製一個文件,但不知怎的,來自源的權限不會複製到目標。有誰知道如何做到這一點?示例和代碼如下所示:)Unix:複製原始權限的文件C

我的文件和他們的原始權限。 My files and their original permission.

成功複製文件但未複製權限。 Successfully copied the file but the permission was not copied.

#define buff_s  4096 
#define mod  0644 

void printError(char *, char *); 

main(int ac, char *txts[]) 
{ 
    int  input, output, n_chars; 
    char buf[buff_s]; 

    struct stat file1; 
    struct stat file2; 
    stat(txts[1], &file1); 
    stat(txts[2], &file2); 

    if ((input=open(txts[1], O_RDONLY)) == -1) 
     printError("error", av[1]); 

    if ((output=creat(txts[2], mod)) == -1) 
     printError("error", txts[2]); 
+1

還要注意,'read()'和'write()'返回'ssize_t'而不是'int'。他們是不一樣的。 –

+0

謝謝你指出。 – mmm

+0

Garg365,我會嘗試你提供的方法,我認爲它也會起作用 – mmm

回答

4

你只需要讀取源文件的權限,並設置目標文件相同的權限。您可以使用stat()讀取權限和chmod()對其進行設置:

#include <sys/stat.h> 

void copyPermission(const char* fromFile, const char* toFile) { 
    struct stat tmp; 
    stat(fromFile, &tmp); 
    chmod(toFile, tmp.st_mode); 
} 

(注:忽略錯誤檢查)。

在底部你main功能,你可以簡單地這樣做:

chmod(av[2], file1.st_mode); 

另一種選擇是簡單地創建一個具有正確的權限的文件:

相反的:

if ((out_fd=creat(av[2], COPYMODE)) == -1) 

if ((out_fd=creat(av[2], file1.st_mode)) == -1) 
+2

由於文件正在被複制,並且有進程打開文件描述符,所以你也可以使用'fstat()'和'fchmod()'直接在文件描述符上。 –

+0

我相信你給我的第二個解決方案是最好的。感謝你們對我的幫助 :)。經驗教訓,我從來沒有想過這麼簡單。 – mmm

+0

安德魯亨利,我會嘗試你的方法,並儘快更新解決方案。 (如果有效) – mmm