0

わかりましたので、これはおそらく簡単な解決策ですが、少し検索してテストした後、私は混乱したままです.. :(

ここに私が書いたコードのスニペットがあります:

int main(int argc, char *argv[]){
  int test;
  test = copyTheFile("test.txt", "testdir");
 if(test == 1)
    printf("something went wrong");
 if(test == 0)
    printf("copydone");
 return 0;
}

int copyTheFile(char *sourcePath, char *destinationPath){
    FILE *fin = fopen(sourcePath, "r");
    FILE *fout = fopen(destinationPath, "w");
    if(fin != NULL && fout != NULL){
        char buffer[10000];//change to real size using stat()
        size_t read, write; 

        while((read = fread(buffer, 1, sizeof(buffer), fin)) > 0){
            write = fwrite(buffer, 1, read, fout);
            if(write != read)
                return 1;       
        }//end of while
    }// end of if
    else{
        printf("Something wrong getting the file\n");       
        return 0;}
    if(fin != NULL)
        fclose(fin);
    if(fout != NULL)
        fclose(fout);
return 0;
}

簡単なメモ: 私は C、プログラミング、特にファイル I/O に非常に慣れていません。fopen、fread、および fwrite の man ページを調べました。いくつかのサンプルコードを見た後、私はこれを思いつきました。単純なテキスト ファイルをコピーして、destinationPath で指定された宛先フォルダーに配置しようとしていました。

テキスト ファイルを配置するフォルダーは testdir と呼ばれ、コピーするファイルは test.txt と呼ばれます。

copyFile 関数で使用しようとした引数は次のとおりです。

  • 「test.txt」「テストディレクトリ」
  • 「.../Desktop/project/test.txt」「.../Desktop/project/testdir」
  • "/Desktop/project/test.txt" "/Desktop/project/testdir"

試行するたびに、「ファイルの取得に問題があります」という印刷ステートメントが表示されます。「testdir」がファイルではなくフォルダーであるためではないかと考えていますが、フォルダーにコピーするにはどうすればよいですか?

これが本当に基本的な質問である場合は申し訳ありませんが、私はちょうど問題を抱えているので、アドバイスは素晴らしいでしょう!

また、さらに役に立ちたい場合は、「copyTheFile」関数は形式に関係なくファイルをコピーすることになっています。.jpg などの場合は、コピーする必要があります。あなたの誰かがそれに問題を見つけたら教えてください。

これは、Linux の ISO/POSIX/C89/C99 にあります。

4

2 に答える 2

10

stdio.h最初に、提供するものFILEと I/O 関数の宣言を含める必要があります。

#include <stdio.h>

これとは別に、あなたのプログラムはコンパイルされ、適切に動作します。残念ながら、宛先がディレクトリであるかどうかを検出するために使用せずにディレクトリにコピーすることはできませんstat()。そうであれば、ファイルを開く前にファイル名を追加します。

その他のマイナーな提案:

  • のような 2 バイトの累乗のバッファは、4096ファイル システムとディスク アクセス パターンに沿っているため、おそらくより効率的です。

  • 従来、ステータス コードを返す C 関数は0、成功と失敗などのその他の値を使用するため1、戻り値を交換することで混乱が軽減される場合があります。

  • fopenfreadまたはなどの標準ライブラリ関数fwriteが失敗した場合は、次のように使用perror(NULL);またはperror("error prefix");報告することをお勧めします。

    $ ./a.out
    ...
    エラー接頭辞: そのようなファイルまたはディレクトリはありません
于 2013-11-09T07:54:29.183 に答える
0

ディレクトリに新しいファイルを書き込もうとしている場合は、書き込むファイルのフル パスを指定する必要があります。あなたの場合

"C:...\Desktop\project\testdir\testfile"

于 2013-11-09T07:50:25.023 に答える