C言語関係掲示板

過去ログ

No.907 ファイルの移動

[戻る] [ホームページ]
No.732

ファイルの移動(NetBSDにて)
投稿者---C言語初心者(2003/11/27 12:02:11)


初めて投稿させていただきます。
現在、UNIX系OSのNetBSDにて開発を行っております。
UNIXコマンドの"mv"のような「ファイル移動機能」を実現するには、どうすればよいでしょうか?
コマンドを呼ぶ関数systemを使って、
system("mv");
と言う方法では、できるとは思います。
ですが、この方法を使わないでプログラムする方法は、ありますでしょうか?
よいアイディアがあればご教授いただければと思います。

No.733

Re:ファイルの移動(NetBSDにて)
投稿者---ともじ(2003/11/27 12:17:53)


>UNIXコマンドの"mv"のような「ファイル移動機能」を実現するには、どうすればよいでしょうか?

renameでいかがでしょう。
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/rename.2.html

No.740

Re:ファイルの移動(NetBSDにて)
投稿者---C言語初心者(2003/11/27 18:10:53)


>>UNIXコマンドの"mv"のような「ファイル移動機能」を実現するには、どうすればよいでしょうか?
>
>renameでいかがでしょう。
>http://www.linux.or.jp/JM/html/LDP_man-pages/man2/rename.2.html
返答していただいた皆さん。
ありがとうございました。

No.734

Re:ファイルの移動(NetBSDにて)
投稿者---すがりん(2003/11/27 13:05:14)


一つのファイルしか移動できませんし
エラーチェックなども一切やってませんし、
"/" 等のディレクトリ区切りはユーザがつけなければなりませんし、
使い勝手は悪いですが、考え方だけはわかると思います。

#include <stdio.h>

int main(int argc, char **argv)
{
    FILE	*fromfp,*tofp;
    char	buf[1024], fname[100];

    sprintf(fname, "%s%s", argv[2], argv[1]);

    fromfp = fopen(argv[1], "r");
    tofp = fopen(fname, "w");

    while (fgets(buf, sizeof(buf), fromfp) != NULL) {
	fputs(buf, tofp);
    }

    fclose(fromfp);
    fclose(tofp);

    remove(argv[1]);

    return 0;
}


No.736

Re:ファイルの移動(NetBSDにて)
投稿者---かずま(2003/11/27 14:38:31)


> 一つのファイルしか移動できませんし

そのファイルがバイナリファイルの場合、移動できないことがあります。
fputs() は 0x00 を出力できません。

No.738

Re:ファイルの移動(NetBSDにて)
投稿者---すがりん(2003/11/27 17:48:35)


>そのファイルがバイナリファイルの場合、移動できないことがあります。
>fputs() は 0x00 を出力できません。

忘れてました。

素直にrenameを使うのが良さそうですね。どうも失礼しました。

No.742

Re:ファイルの移動(NetBSDにて)
投稿者---かずま(2003/11/27 18:49:45)


> 素直にrenameを使うのが良さそうですね。どうも失礼しました。
そうとも言い切れません。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/rename.2.html
のエラーのところにも、

EXDEV 
    oldpath と newpath が同じファイル・システムに存在しない。 

という説明がありますし、実際、NetBSD で

    if (rename("/tmp/file", "/var/tmp/file") == -1)
        perror("rename");

を実行すると、rename: Cross-device link と表示されます。

したがって、

    while ((c = getc(fromfp)) != EOF)
        putc(c, tofp);

でコピーするなら意味があります。