2011-07-24 9 views
9

この質問はかなりシンプルですが、プラットフォーム依存性なしでCでファイルをコピーするための明確な解決策が見つかりません。プラットフォーム依存性のないファイルをC言語でコピーするにはどうすればよいですか?

オープンソースプロジェクトでディレクトリを作成し、ファイルをコピーして外部プログラムを実行するためにsystem()コールを使用しました。 Mac OS Xやその他のUnix-ishシステムではうまく動作しますが、Windowsでは失敗します。問題があった。

system("cp a.txt destination/b.txt"); 
  • Windowsは、パスの区切りのためのバックスラッシュを使用しています。 (Unix-ishのスラッシュと対比)
  • Windowsは、内部コピーコマンドに「コピー」を使用します。 (vs Unix-ishのcp)

依存関係のないコピーコードを書くにはどうすればよいですか?

(実は、私はこの問題を解決するために、マクロを書いたが、それはクールではありません。http://code.google.com/p/npk/source/browse/trunk/npk/cli/tests/testutil.h、L22-56)

+0

問題は、「コピー」にぶら下がっていません上記のように。 – lqez

答えて

6

あなたはstdio.hでC標準ライブラリ関数を使用する必要があります。

特に、fopen,fread,fwriteおよびfcloseで十分である。

fopenのフラグにb(「バイナリ」)オプションを必ず含めてください。

[編集]

残念ながら、ファイル名そのもの(フォワードスラッシュ対バックスラッシュ)はまだプラットフォームに依存しています。だから、それに対処するには#ifdefまたはそれに類するものが必要です。

cross-platform toolkitを使用することもできます。

+0

お返事ありがとうございます。しかし、クロスプラットフォームのツールキットは私の小さなプロジェクトにとっては大きすぎます。スラッシュ問題を解決する簡単な解決策はありませんか? – lqez

+2

ディレクトリ組織はプラットフォーム固有であるため、完全に自明な方法はありません。ただし、APIレベルでは、Windowsではパス名にスラッシュまたはバックスラッシュを使用できます(バックスラッシュが必要なcmd.exeシェルです)。だから、あなたのUnix名にバックスラッシュ(そしておそらくコロンでもない)が含まれていない限り、あなたは大丈夫でしょう。 –

+0

@ジョナサン:OK、私はそれを知らなかったと認めます。 Windows上では正式なスラッシュを含むファイル名はどうでしょうか?たぶん私はたまにそれを試してみるべきです:-) – Nemo

0

標準Cライブラリstdio.hを使用してください。最初にfopen(inputFilename, "rb")を使用して読み込み用入力ファイルを開き、fopen(outputFilename, "wb")を使用して書き込み用に出力ファイルを開き、freadfwrireを使用してコンテンツをコピーします。次に、fcloseを使用して両方のファイルを閉じます。

8

system()機能はそれほど価値がありません。それはシェルを別個のプロセスで呼び出すため、通常は避けるべきです。

代わりfopen()a.txtdest/b.text、および(標準ライブラリはあなたよりも、ページ整列バッファリングを行う可能性が高いので)コピーを行うにはgetc()/putc()を使用

FILE *src = fopen("a.txt", "rb"); 
FILE *dst = fopen("dest/b.txt", "wb"); 
int i; 
for (i = getc(src); i != EOF; i = getc(src)) 
{ 
    putc(i, dst); 
} 
fclose(dst); 
fclose(src); 
+0

答えをいただき、ありがとうございます。しかし、パス区切りの問題は解決されません。よる – lqez

+1

:http://msdn.microsoft.com/en-us/library/77859s1t(v=VS.71).aspxパスセパレータはない 'はfopen()'オン() ''問題システムです。シェル呼び出しのためにシステムで失敗します。 – Dave

+0

本当にありがとうございます。 – lqez

関連する問題