• ベストアンサー

FTPで書き込み中のファイルの完了を知りたい

FTPで書き込み中のファイルがあるとします。そのファイルが、書き込み中なのか、それとも、書き込みが完了したのかを、知りたいのですが、良い方法はありますでしょうか。書き込みファイル名はあらかじめ、わかっています。(書き込み中に読んだ場合、最後まで読み切ることが出来ないために書き込み完了迄待ちます)当方で、調査した限りでは、ファイル名を指定して、そのファイルが、他プロセスによってオープンされているか否かを知るシステムコールは存在しませんでした。OSは、sun solaris10を使用の予定ですが、UNIX系(linux含む)で実現可能であれば、かまいません。

質問者が選んだベストアンサー

  • ベストアンサー
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.2

一般のUnix系のOSで、fopen() でチェックできるかどうかは疑問です^^ たしかに、Unix系のOSで、ファイルをオープンしているプロセスがあるかどうかを調べられるような標準的なシステムコールがあるという話は、あまり聞かないですよね。 http://www.mlb.co.jp/linux/mld-ml/200206/msg00028.html ←存在しないのがほんとに真実かどうかは知りませんが^^ ftp の際、get してくるファイルのサイズ情報をどこかに出力しておいて、そのサイズに達したか否かで、「書き込み中か、書き込み完了か」を判定するのがもっともポータブルな方法かと^^ ※ 最初に lseek などして、見掛けのサイズを大きくしておいてから rewind して実際に書き込みを始めるみたいなことしてる ftp の実装なんてあるとまずいですけど^^;

tatsu99
質問者

お礼

ご回答ありがとうございます。やはり、無いと考えたほうが、良さそうでね。求めるシステムコールが、存在しない場合の対策案は、私のほうで、2、3検討済みです。 1案:対象ファイル送信後に、送信完了を示す、別なファイル(サイズ:0)をおくる。読み込み側は、サイズ:0のファイルの出現で、目的ファイルの送信完了を判定。 2案:対象ファイルを別の一時的な名前で書き込み、完了後に正規の名前にリネームする。リネームされて、求めるファイルが出現したときは、既に書き込みが完了されたファイルとなっている。 3案:実際のファイルの内容の最後に、ファイル終端であることを示す、あらかじめ決められた特定の文字列を書き込む。読み込み側は、その文字列まで読めれば、書き込みが完了したファイルと判定する。 などの方法がありますが、いずれもFTPの送信側(書き込み側)にある一定の操作が必要となります。できたら、そのような操作をさせたくなかったので、質問した次第です。

すると、全ての回答が全文表示されます。

その他の回答 (12)

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.3

なるほど、そういうことでしたか^^ わたしなら、ファイルサイズを受け取るか、tatsu99 さんの1案を採用しますね。2案はレースコンディションがありそうですし。。3案は、ターゲットのファイルの種類が決まっていて、終了文字がきちんと決められるなら一番簡単な方法ですね。 tatsu99 さんの、1案が一番確実・簡単でいいですかね。

tatsu99
質問者

お礼

回答ありがとうございます。 >2案はレースコンディションがありそうですし。。 とのことですが、具体的にどのような状態を想定されてますでしょうか?

すると、全ての回答が全文表示されます。
回答No.1

fopen(ファイル名,"r+") オープンできれば書き込み終了、失敗ならば書き込み中。

tatsu99
質問者

お礼

ご回答ありがとうございます。提示していただいた方法を当方にて確認しましたところ、他のプロセスが、書き込み中でも、正常にオープン出来てしましました。 以下、書き込み側のソースです。 #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <errno.h> int main(int argc , char *argv[]) { FILE *fp; char area[256]; int i = 0; if (argc == 1){ printf("%s 書き込みファイル名\n",argv[0]); exit(0); } fp = fopen(argv[1],"w"); if (fp == NULL){ printf("fopen error\n"); exit(0); } while(1){ sprintf(area,"===============%d================\n",i++); if (fputs(area,fp) == EOF){ printf("fputs error\n"); exit(0); } if (fflush(fp) == EOF){ printf("fflush error\n"); exit(0); } printf("%d完了\n",i); sleep(10); } fclose(fp); return(0); } 以下、読み込み側のソースです。 #include <string.h> #include <stdlib.h> #include <math.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> int main(int argc , char *argv[]) { FILE *fp; char area[256]; int i = 0; if (argc == 1){ printf("%s 読み込みファイル名\n",argv[0]); exit(0); } fp = fopen(argv[1],"r+"); if (fp == NULL){ printf("fopen error\n"); exit(0); } printf("オープン成功\n"); fclose(fp); return(0); } 動作確認は Solaris10(INTEL版) cent-os 4.4 で行いました。

すると、全ての回答が全文表示されます。

関連するQ&A