2017-04-26 8 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()'は 'int'ではなく' ssize_t'を返すことにも注意してください。彼らは同じではありません。 –

+0

ありがとうございました。 – mmm

+0

Garg365、あなたが提供する方法を試してみましょう。私はそれもうまくいくと思います。 – mmm

答えて

4

あなただけのソースファイルの読み取り権限を、宛先ファイルに同じ権限を設定する必要があります。あなたはそれらを設定する権限とchmod()を読むためにstat()を使用することができます。

#include <sys/stat.h> 

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

(N.B.のエラーチェックは省略します)。一番下にあなたのmain機能で

あなたは、単にこれを行うことができます:

の代わりに::

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

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

他のオプションは、単に右の権限を持つファイルを作成することです

do

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

ファイルがコピーされているので、プロセスにオープンファイル記述子があるので、 'fstat()'と 'fchmod()直接ファイル記述子に書いてください。 –

+0

私はあなたが私に与えた2番目の解決策が最高のものだと信じています。助けてくれてありがとう :)。レッスンで学んだことは、それが簡単だとは決して考えなかった。 – mmm

+0

Andrew Henle、私はあなたの方法を試し、直ちにソリューションを更新します。 (それが動作する場合) – mmm

関連する問題