FTPで書き込み中のファイルがあるとします。そのファイルが、書き込み中なのか、それとも、書き込みが完了したのかを、知りたいのですが、良い方法はありますでしょうか。書き込みファイル名はあらかじめ、わかっています。(書き込み中に読んだ場合、最後まで読み切ることが出来ないために書き込み完了迄待ちます)当方で、調査した限りでは、ファイル名を指定して、そのファイルが、他プロセスによってオープンされているか否かを知るシステムコールは存在しませんでした。OSは、sun solaris10を使用の予定ですが、UNIX系(linux含む)で実現可能であれば、かまいません。
No.2ベストアンサー
- 回答日時:
一般のUnix系のOSで、fopen() でチェックできるかどうかは疑問です^^
たしかに、Unix系のOSで、ファイルをオープンしているプロセスがあるかどうかを調べられるような標準的なシステムコールがあるという話は、あまり聞かないですよね。
http://www.mlb.co.jp/linux/mld-ml/200206/msg0002 … ←存在しないのがほんとに真実かどうかは知りませんが^^
ftp の際、get してくるファイルのサイズ情報をどこかに出力しておいて、そのサイズに達したか否かで、「書き込み中か、書き込み完了か」を判定するのがもっともポータブルな方法かと^^
※ 最初に lseek などして、見掛けのサイズを大きくしておいてから rewind して実際に書き込みを始めるみたいなことしてる ftp の実装なんてあるとまずいですけど^^;
ご回答ありがとうございます。やはり、無いと考えたほうが、良さそうでね。求めるシステムコールが、存在しない場合の対策案は、私のほうで、2、3検討済みです。
1案:対象ファイル送信後に、送信完了を示す、別なファイル(サイズ:0)をおくる。読み込み側は、サイズ:0のファイルの出現で、目的ファイルの送信完了を判定。
2案:対象ファイルを別の一時的な名前で書き込み、完了後に正規の名前にリネームする。リネームされて、求めるファイルが出現したときは、既に書き込みが完了されたファイルとなっている。
3案:実際のファイルの内容の最後に、ファイル終端であることを示す、あらかじめ決められた特定の文字列を書き込む。読み込み側は、その文字列まで読めれば、書き込みが完了したファイルと判定する。
などの方法がありますが、いずれもFTPの送信側(書き込み側)にある一定の操作が必要となります。できたら、そのような操作をさせたくなかったので、質問した次第です。
No.13
- 回答日時:
No.12
- 回答日時:
> 運用上、上記の短所が問題にならなければ、採用の候補…
あはは。ありがとうございます(笑)まぁ、人間、自分のアイデアを大事にしたいというのが普通ですから^^ ここは、議論の場ではないようですが、色々とアイデアを出し合うのは楽しいですね。ではでは、お邪魔しました^^
====
// ディレクトリから fname にファイル名を得る
…
char *p = strrchr(fname, '_');
if (p == NULL) return; // 約束違反のファイル名
char *q = strrchr(fname, '.');
if (q == NULL || q < p) return; // 約束違反のファイル名
*q = '\0';
size_t fsiz = atol(p + 1);
if (fsiz == 0) return; // サイズ0はおかしい(笑)
…
*q = '.';
stat(fname, &statbuf);
if (statbuf.st_size != fsiz) return; // 書き込み中?
…
===
# .netrc が適当に設定されているとして
…
fname=`basename $pathname`
fsiz=`ls -l $file | awk '{print $5}'`
remotefile=`echo $fname | sed -e "s/\\([^.]*\\)\\.\\([^.]*\\)/\\1_$fsiz\\2/"`
ftp $remotehost <<EOF
bin
put $pathname $remotefile
bye
EOF
===
とか、やればいいんじゃないですか?^^ 修正時刻のチェックは、エラー処理に活用できますね(現在時刻と最終修正時刻の差があまりに大きいにもかかわらず、サイズが異なる場合など)。
ソースまで提示していただき、ありがとうございます。mikaemi様の案が採用となった暁には、是非このソースも参考にさせていただきます。
No.11
- 回答日時:
もう一案。
手元にcygwinしかないので確認できないのですが。
まず実験として、
(1)pfilesコマンドでFTPデーモンのファイルディスクリプタ一覧を得る。
(2)ファイルディスクリプタ一覧のinode番号で、目的とするファイルが使用中か確認する。目的のファイルのinode番号はstatで得ておく。
なんてのはどうでしょうか?
pfilesコマンド自体の機能もソース見ればわかると思うので、プログラム上に吸収可能だと思います。
回答ありがとうございます。いくつかの理由があって、たぶん、この方法を採用することは、無いとおもいますが、デーモンが「特定のファイルを書き込み中」か否かを判断する方法としては、最もこの案が、正解に近いと思います。又、pfilesコマンドの存在について判っただけでも収穫でした。ありがとうございました。
No.10
- 回答日時:
なるほど。
。修正時刻のチェックしてもいいですね。各人各様で思いつくテクニックが異なっておもしろいですね^^そういえば、ファイル名にファイルサイズを入れるとしても、バイナリモードで転送しないと、Windows⇔Unix⇔Macintoshなんかは、サイズが変わってしまいますねぇ。まぁ、でも、バイナリで転送するとして、stat()・lstat() を使うなら読み続けなくても、ファイルが置かれるディレクトリを舐めて、各ファイルの名前から取得したファイルサイズとstat()が返すファイルサイズをチェックするだけでいいですね^^
回答ありがとうございます。
>バイナリで転送するとして、stat()・lstat() を使うなら読み続けなくても、ファイルが置かれるディレクトリを舐めて、各ファイルの名前から取得したファイルサイズとstat()が返すファイルサイズをチェックするだけでいいですね^^
上記の場合の長所と短所は以下になるかと思います。
長所:statが一回ですむ。
短所:FTP送信側での処理が多少発生する。
受信側でもファイル名にファイルサイズを含むため、ファイル名が固定にならずに、XXXXX_nnnnnn(nnnnnはファイルサイズ)にマッチするようなファイルを取得する必要がある。
運用上、上記の短所が問題にならなければ、採用の候補として検討したいと考えています。
No.9
- 回答日時:
すごく大雑把な方法ですが、statで最終修正時刻を調べて一定時間以上変更がなかったら書き込みが終了とみなすのはだめでしょうか?
信頼性と即時応答性は限りなく低いですが。
回答ありがとうございます。
>すごく大雑把な方法ですが、statで最終修正時刻を調べて一定時間以上変更がなかったら書き込みが終了とみなすのはだめでしょうか?
その方法と同じではないですがstatでファイルサイズを調べて、一定時間経過後、前回と同じなら、書き込み完了とみなす。
ということは、考えておりました。
statで調査する場合は以下の長所/短所になるかと思います。
長所:FTPの送信側によけいな処理をさせないで済む。
短所:>>「信頼性と即時応答性は限りなく低いですが。」
運用上、上記の短所が問題にならなければ、statを繰り返す方法もありかと考えております。
No.7
- 回答日時:
それでは、ファイル名に、ファイルサイズを含めれば簡単じゃないですかね。
ファイル名の長さに余裕があるシステムだと仮定して、たとえば、123456Byte なら、filename_123456.txt とか^^ 安易すぎるかな(笑)No.6
- 回答日時:
あぁ、なるど。
。。送り手側が、別マシンから受け手側のマシンに ftp でファイルを put しにくるわけですか。。「ssh などを使わないので、リモートでコマンド実行できるわけではないため、受け手側はファイルが置かれたかポーリングはするが、書き込みが終了しているかを確認する手軽な手段が欲しかった」というわけですね。はい、まさに、その通りです。「受け手側はファイルが置かれたかポーリングはするが、書き込みが終了しているかを確認する手軽な手段」を実現するシステムコールがあればと思って、質問した次第です。
No.5
- 回答日時:
あぁ、あと、ftp をプログラム内から fork()・exec() させてるなら、wait() したり、ほかに仕事があるなら waitpid() したり、 SIGCHILD をうけとるようにしたりする方法もありますね^^
tatsu99 さんは、詳しそうなのでご存知でしょうが^^ 蛇足として。。。(笑)
ファイルの送信側は、シェルスクリプトからftpコマンドを呼びだすことを、今は、考えています。ですので、あまり複雑なことは、出来ません。また、送信側にあまり、コストをかける訳にもいかないので、シェルから呼び出す程度になるかと思います。まあ、送信時のエラー検知ぐらいは、したほうが良いと考えていますが・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
FTPの送信結果を検知したい
その他(プログラミング・Web制作)
-
FTPでのGET
その他(ソフトウェア)
-
ファイルが書き込み中かどうかの判定方法は?
UNIX・Linux
-
-
4
シェルスクリプトでFTPの実行結果を取得するには
その他(プログラミング・Web制作)
-
5
ftpでファイルを転送時、タイムスタンプを維持したい
UNIX・Linux
-
6
FTPでputすると空ファイルが出来てしまう
その他(プログラミング・Web制作)
-
7
FTPで存在しないファイルをGETしたときの動作について
その他(コンピューター・テクノロジー)
-
8
ftpコマンドのput,mputの上書きしない方法について
サーバー
-
9
FTP受信直後に受け取ったファイルを処理するプログラムを起動するには?
UNIX・Linux
-
10
FTPコマンドでgetしたい
その他(プログラミング・Web制作)
-
11
マルチスレッドで同時にFTPアップロードをしたいです...
C言語・C++・C#
-
12
FTPでPUTできない原因は何?
Mac OS
-
13
ftpのmgetコマンドの自分の格納場所の指定方法は?
Windows Me・NT・2000
-
14
Visual C++からftpを使う
C言語・C++・C#
-
15
System.IO.Directory.GetFilesの順番
Visual Basic(VBA)
-
16
TCP環境下でのファイル破損は起こるのか?
その他(コンピューター・テクノロジー)
-
17
IPアドレス「0/16」とか「0/24」って何?
ネットワーク
-
18
HULFTとOWFTの違いについて
その他(ソフトウェア)
-
19
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
20
FTPに接続し、 あるフォルダ内の一覧を取得する、、、という操作を Windows10のコマンドプロ
Windows 10
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SNSなどで使われる、n回目とは...
-
中学生でも薬局でTENGAって買え...
-
職場で噂される男女とされない...
-
仕事帰り社内の人と同じ時間に...
-
5ch
-
高2の女子です。 修学旅行で、...
-
エクセルのデータはDVDに保...
-
雑談たぬきについてなのですが...
-
自分から話しかけない人ってそ...
-
語尾に笑いが含まれる人の心理 ...
-
職場の異性と遊んだ事が知られ...
-
これなんでスレ立てられないん...
-
CD-Rへの「書き込み速度」によ...
-
私のPCで、48倍速対応のCD-Rが...
-
メールソフト サンダーバード...
-
子どもは作らない方が賢い、ま...
-
職場内で「不倫してる」と周り...
-
熟女の保険外交員って誘ってま...
-
職場の話しづらい異性。 元々は...
-
winx DVD authorで作ったDVD-R ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
中学生でも薬局でTENGAって買え...
-
SNSなどで使われる、n回目とは...
-
仕事帰り社内の人と同じ時間に...
-
職場で噂される男女とされない...
-
自分から話しかけない人ってそ...
-
付き合ってそうな男女が職場に...
-
apxアップデートの認証中遅すぎ...
-
5ch
-
雑談たぬきについてなのですが...
-
カカオトークのリンクの貼り付...
-
子どもは作らない方が賢い、ま...
-
もし男性で教員をしている人が...
-
語尾に笑いが含まれる人の心理 ...
-
カカオトーク退会すると、エラ...
-
エクセルのデータはDVDに保...
-
カカオトークで、私が送った写...
-
別れた途端に女友達や新しい女...
-
メールソフト サンダーバード...
-
私の好きな人が、LINEの返信は...
-
障害者の嫁
おすすめ情報