0

わかりました。POSIXAPIを使用してCでファイルを書き込む宿題があります。この宿題では、読み取り元のファイル名、書き込み先のファイル名を要求し、一方を他方にコピーします。私はこれを行いました、そしてそれは素晴らしい働きをします!エラーチェックインを入れようとしていますが、書き込み先のファイルが既に存在するかどうかを確認し、存在する場合は、ユーザーが上書きするかどうかを確認します。問題は、ファイルが存在しない場合でも、ファイルが存在することを常に示していることです。プログラムの残りの部分は問題なく動作します。私はここで多くのことを読み、POSIXで多くの有用なものを見つけましたが、参照するこのタイプの問題を見つけることができません。以下は私のコードです:

#include <fcntl.h>   // POSIX: give access to open
#include <unistd.h>  // POSIX: gives access to read, write, close
#include <stdio.h>   // POSIX: gives access to BUFSIZ

int main() {

int source = -1;
int target;
char sourcefile[50];
char targetfile[50];
char buff[BUFSIZ];
char ow[3];
size_t size;

printf("Please enter the name of the file you wish to read: ");
scanf( "%s", sourcefile );
printf( "\n" );
printf("Please enter the name of the file you wish to write to: ");
scanf( "%s", targetfile );
printf( "\n" );

source = open( sourcefile, O_RDONLY, 0);
//Test for existence of input file
if( source == -1 )
{
    perror( "Cannot find file" );
    return 1;
}
target = open( targetfile, O_WRONLY, 0644 );
//Test for existence of output file
if( target == 0 )
{
    perror( "File already exists" );
    printf( "Do you wish to overwrite? (yes or no): " );
    scanf( "%s", ow );

    if( strcmp( ow, "yes" ) == 0 )
    {
        target = open( targetfile, O_WRONLY | O_CREAT, 0644);   
    }else
    {
        printf( "Program Terminated!\n" );
        return 1;   
    }   
}else if( target == -1 )
{
    target = open( targetfile, O_WRONLY | O_CREAT, 0644);
}

while ((size = read(source, buff, BUFSIZ)) > 0) 
{
    write(target, buff, size);
}

close(source);
close(target);

return 0;
}
4

1 に答える 1

3

を使用open(2)O_EXCLて、新しいファイルと称するファイルを作成できます。ファイルがすでに存在する場合、これは失敗します。その場合、致命的に中絶します。それ以外の場合は、目的のファイルの内容を書き込むことができます。

アトミックになりたい場合は、ファイルの内容を一時ファイルに書き込み(を使用してtmpfile)、作成したファイルをアトミックに置き換えることができますrename(2)。そうすれば、新しいファイルは空または完全なコピーになります。


別の方法(@R。が推奨)は、ターゲットファイルをわざわざ開いて一時ファイルにコピーし、link(2)代わりにrename新しいファイルを宛先の場所に配置しようとしないことです。宛先がすでに存在する場合、これは失敗します。これには、他の誰かがその間にターゲットファイルを作成し、私たちと同じ注意を払わない場合、その場合はもう少し穏やかになるという(議論の余地のある)利点があるかもしれません。(しかし、他の誰かが気にせずにファイルシステムの周りにスタンピードを望んでいる場合、あなたができることはそれほど多くありません。)

于 2013-01-29T00:47:21.863 に答える