質問するログイン新規登録

Q&A

4回答

408閲覧

他システムとのファイル連携での一般的なやり方について

keisukestrat

総合スコア13

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

0グッド

2クリップ

投稿2026/03/17 02:18

編集2026/03/19 09:44

0

2

実現したいこと

他システムとのファイル連携において、ファイルの削除、更新、リネームのタイミングの制御について
参考となる書籍や一般的なやり方はあるでしょうか。

自分のシステムとAシステムとのやり取りにおいて、
以下の基本的な流れがあります。

(追記)環境について

  • Aシステムは他社システムのため、ファイルの制御が非同期で行われます。そのため、仕様の変更ができるかどうかは恐らく不可の認識でいます。
  • Aシステム側は不明ですが、FTPで自分のシステム(Windows)から取得する想定でいます。
  • Aシステム→自分のシステムに1対1での受け渡しで、他にAの同じファイルを取りに来る他システムはありません。
  • Aシステムからは随時で連携されるため(秒単位ではなかったはずですが・・・)、1日に何回も更新が行われる見込みです。
  • 自分のシステムは、1日に1回以上の取得・削除処理を行う想定でいます。

①通常の連携
①-1.Aシステムがフォルダ「temporary_YYYYMMDD_999999」にファイル「AAA.csv」、「BBB.jpg」、「CCC.xlsx」を格納

①-2.格納完了後、Aシステムがフォルダ名を「temporary_YYYYMMDD_999999」から「YYYYMMDD_999999」にリネーム

①-3.自分のシステムが「YYYYMMDD_999999」(※)をダウンロード

①-4.自分のシステムが「YYYYMMDD_999999」を削除

※受付データが追加する場合は、連番で「999999」で番号を振るイメージ

②登録データの更新
※自分のシステムがダウンロードをする前にAシステムでデータの更新が連携されるパターン
Aシステム側がフォルダを削除し、再度リネームしたフォルダを作成するケース

②-1.Aシステムがフォルダ「temporary_YYYYMMDD_999999」にファイル「AAA.csv」、「BBB.jpg」、「CCC.xlsx」を格納

②-2.格納完了後、Aシステムがフォルダ名を「temporary_YYYYMMDD_999999」から「YYYYMMDD_999999」にリネーム

②-3.Aシステムが既にあるフォルダ名「YYYYMMDD_999999」を削除

②-4.Aシステムがフォルダ「temporary_YYYYMMDD_999999」にファイル「AAA.csv」、「DDD.jpg」、「EEE.docx」を格納

②-5.自分のシステムが「YYYYMMDD_999999」をダウンロード

②-6.自分のシステムが「YYYYMMDD_999999」を削除

発生している問題・分からないこと

①の通常の連携であれば、自分のシステムが取得するときは問題ないと思いますが、
②のような、自分のシステムが取得する前にAシステムからのファイルの再更新が発生する際のタイミングで
どうすれば、削除或いは更新を防げるかを検討しています。

②-3と②-⑤のタイミングが同時に発生した場合にファイルの破損や
②-4と②-⑤のタイミングが同時に発生した場合にファイルの消失を防ぐために、
何か参考となるものがないかを探しています。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

検討段階のため、自分のシステムが取得する際はフォルダ毎リネームして「downloading_YYYYMMDD_999999」に切り替えた後、
取得が完了したらそのフォルダを削除するなどの方法はあるかとは思います。
或いはフォルダ自体にロックファイルを用意する方法でしょうか・・・

ただ、思いつくだけで、一般的なやり方や参考となるような書籍があるといいなと思い
今回、質問をしたものとなります。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

dodox86

2026/03/17 06:14

異種OS、プラットフォーム間、レガシーシステムとの連携などでファイルやディレクトリをベースとしたやり取りはしばしば発生します(<私もいくつか経験があります)が、Aシステムの方は手順の仕様を変更できるのでしょうか? あと、OS・ファイルシステムの種別によっても制限が変わってくる場合があるので、それらも示すと良いと思います。なんとなくWindows系のお話のようにも思えますが。
tmp

2026/03/17 08:53

Aシステムも変更可能なのでしょうか?
keisukestrat

2026/03/19 09:28

ご確認ありがとうございます。 Aシステム側は他社となるため、Aシステム側は不明ですが、FTPで自分のシステム(Windows)から取得する想定でいます。 構成部分を追記しました。 ただ、「Aシステムの方は手順の仕様を変更できるのでしょうか?」と頂いた通り、 手順の仕様の変更ができるかについて、恐らく不可という認識でいます。
otn

2026/03/19 10:51

質問が「一般的なやり方」を聞いているので、私も含めたみなさん、A側も含めた方法を書いています。 質問の趣旨が、「一般的なやり方を知りたい」ならそれでOK。 そうじゃなくて、今回のあなたの抱えている特定の状況での解決策を求めているのなら、「一般的なやり方」とは全然違う話なので、制約条件含めて、もれなく書く必要がありますので、もしそれを聞きたいなら、質問を別途立てるのでしょうね。
otn

2026/03/19 11:27 編集

制約を追記したようですが、全般的に正確に書きましょう。 質問に元からある、 ②-2.格納完了後、Aシステムがフォルダ名を「temporary_YYYYMMDD_999999」から「YYYYMMDD_999999」にリネーム ②-3.Aシステムが既にあるフォルダ名「YYYYMMDD_999999」を削除 ですが、フォルダー名が"20260319_999999"のようなものだと、今作ったデータが削除されます。 実際のフォルダーネーミングは YYYYMMDD_HHMMSS のようなもので、 20260319_090340 がその日の最初にできて、更新で 20260319_132259 を作ったら、古い 20260319_090340 を削除するということなのですかね? YYYYMMDDは固定文字列じゃなくて日付だろうと想像つきますが、999999については何の説明もないです。YYYYMMDDも想像に任せるのじゃなくて、明記すべきですが。 もしそうなら、毎回フォルダー名を変えるべきという68userさんや私の書いた通りにすでになっているということですね。それなら「最新のデータが欲しい」が要件なら問題ないと思いますけど。 もし「1日に複数回データが作成された場合に、すべてのバージョンのデータをほしい」なら、そもそも不可能でしょう。Aが古いフォルダーを削除しないのなら可能(古いフォルダーは受信したらあなたが削除するはずなので、それに任せる)。
guest

回答4

0

※自分のシステムがダウンロードをする前にAシステムでデータの更新が連携されるパターン

2つのシステムが非同期で動作しているようですので、「②登録データの更新」の処理は実現不能というか、そういうプロトコルにしてはいけません。

システムAは「フォルダ名を「temporary_YYYYMMDD_999999」から「YYYYMMDD_999999」にリネーム」した後は、このフォルダやその内容をいじってはいけません。
この作業の後、にデータ内容の変更が必要になった場合は、新なデータのやりとりをすべきです。

投稿2026/03/17 05:07

編集2026/03/17 05:07
TakaiY

総合スコア14680

keisukestrat

2026/03/19 09:29

ご確認ありがとうございます。 「2つのシステムが非同期で動作しているようです」と頂いた通り、非同期での動作になります。 ただ、Aシステム側の挙動として、「このデータだけ修正」が発生した際に、 既に作成済みのフォルダが削除、新たに作り直すという仕様となっているため、 自分のシステム側でフォルダをリネームして、ダウンロードするまで削除されないようにするのがいいのかなと思ったのですが、 そもそものファイル連携の一般的なやり方が何かあるのかなと思っていた次第です。
TakaiY

2026/03/19 10:45

> 既に作成済みのフォルダが削除、新たに作り直すという仕様となっているため、 ということは他の方の回答にあるように、Aシステムの仕様は決ってしまっているということでしょうか? であれば、それは回答のための前提条件として重要ですので、質問を修正していただくのがいいでしょう。 > そもそものファイル連携の一般的なやり方が何かあるのかなと思っていた 回答に書いたとおりにするのが一般的です。非同期であればさわってはいけません。 Aシステムが変更できないのであれば、Aシステムがどのようなタイミングでどのように動くのかを正確に把握した上で、自分のシステムがどのように動くべきなのか検討する必要があります。 とはいえ、読んだ限り、上手く動くのは絶望的ですが。通常のファイルシステムっていうのは、アトミックな処理はできないし、Aシステムが変更できないのであれば、ロックを含めて同期する方法がないから。 なんども同じファイル読み込んで、変更がないかどうか常に確認していくしかないでしょうね。
guest

0

どちらも自社内のシステムなら、ジョブ管理ツールで全体を制御するというのが間違いのない方法です。
が、質問からすると、今社内にそういうのがないか、Aは他社システムだとかですかね。
今無いものを、このために導入するというのは大変すぎでしょうから、工夫で乗り切るのでしょうね。

質問文に明記されていないことも含めてですが、
・AB間でマウントするようなファイル共有はできない。HTTP/FTP/SCPなどで取得する
・A⇒Bシステムという1対1での受け渡しで、他にAの同じファイルを取りに来るシステムは無い
・Aシステム側では1日に複数回のデータ作成処理が動く
・Bシステムも複数回想定で、定期的にAに目的フォルダーが存在するかどうかチェックして、存在すれば取得処理が動いて、終わったらまたフォルダー存在チェック処理に戻る
という前提です。「自分のシステム」という代名詞的な名前は誤解を招く(AからみるとAが自分)のでBシステムとしています。

別途連絡を取り合わずにA側で更新がかかるなら、フォルダー名を別々にするのが簡単でしょう。
68userさんの書かれている通り、タイムスタンプを付けて更新ごとに違う名前にする。
連番は駄目と書かれていますが、A側で間違いなく連番を付けるのは可能ならばそれでもいいと思います。ただ、連番は名前が短いという以上のメリットはない。

複数作らず、1つの名前でやるとすると、今思いついて書くだけですが、
②-1.2. 3. は質問文と同じ。
追加. 各ファイルのハッシュ値を、YYYYMMDD_hash というファイルに書き込む
②-4.は質問文と同じ。
追加. フォルダーリネームまで終わったら、各ファイルのハッシュ値を、YYYYMMDD_hash というファイルに書き込む

Aとは非同期で、Bシステムが
②-ア.「YYYYMMDD_999999」があればそれをダウンロード
②-イ. データを全部ダウンロードしたら、YYYYMMDD_hashをダウンロード
②-ウ IF ダウンロードしたデータファイルのハッシュ値と、YYYYMMDD_hashの中身が一致
THEN
②-エ. 取得成功。「YYYYMMDD_999999」を削除。取得成功の処理をして次の更新に備えてアに戻る
ELSE
②-オ. 取得中に更新がかかったので取得失敗の処理をしてアに戻る
END IF

実際には、YYYYMMDD_hash を安全に取り込む工夫がいるかもしれませんが、データのファイル数・ファイル名が決まればこのファイルの長さも決まるので、長さが正しければ安全に取り込めたと判断していいと思います。

穴がないかの精査はしてませんが、ご参考に。

回答ではないですが、
フォルダーのリネームで書き込み中と書き込み完了を区別していますが、私がやってたのは、目印ファイルを作る方法です。更新は考慮していない1日1回の処理前提ですが、

  1. A側でファイルを書く
  2. 全部書き終わったら長さゼロの、目印ファイル(固定名称のファイル)を作る
  3. B側では目印ファイルが存在するまで待ち続ける
  4. 目印ファイルが存在したら、ファイルを取得する
  5. 目印ファイルを削除する(翌日の準備の意味)

これの延長で行くなら、Aが目印ファイルのファイル名をタイムスタンプ付きにして、中にファイルのハッシュ値を書き込めばいいのかな。で、Bでは取得済みの目印ファイル名より新しい目印ファイルが出来るのを待つと。

投稿2026/03/17 18:01

otn

総合スコア86580

0

リネームなりロックなりでもいいですけど、何をしたところで
・Aが配置
・Bがロック&取得開始
・Aが再配置しようとしたがロックがかかっていてできない!
といった事態は起こりえますが、その運用の複雑さは覚悟の上ですか?

 ・Aが配置
・Bがロック&取得開始
・Bが取得終了しアンロック
・Aが再配置
の場合は手遅れですけど、どうするんでしょう。

また何のための更新ですか? 新しいデータを送りたいというなら、
Aは「新版はこれです」と配置して、B はそれを取り込めばよいのでは。

もしミスが起こったときに古い版が取り込まれるのはまずいというなら、
・0時 Aが送信開始
・10時 Bが取込開始
として、何かあれば 10時間の間に正しいデータを配置せよという運用はどうですか。
確認が必要というなら、まずはステージング環境に取り込んで運用者が目視確認するとか。

わたしなら以下のようにします。
・A は YYYYMMDD_HHMMSS_マイクロ秒_UUIDv4/ として配置。
(取り回しやすいよう zip 化してもいいかも)
(ファイルを削除するなら、カッコ悪いですが DELETE_BBB.jpg などとファイル名で指示)
・B は ASCII 順で取り込む
・temporary_ はいいと思うけど、それ以外のロックやステータス管理の仕組みは作らない
・冪等性担保リトライやリカバリの運用をしやすくするため
・取込済ってのはローカルで管理するか、done/YYYYMMDD_HHMMSS_マイクロ秒_UUIDv4.txt などとステータスファイルを配置
・連番はやめる (抜けがあったら取込をストップするというなら別にいいですけど…)

投稿2026/03/17 09:04

68user

総合スコア2098

keisukestrat

2026/03/19 09:59

ご確認ありがとうございます。 ロックの場合、ロックがかかって操作できない場合どうするかというのが課題になりそうですね。リネーム・削除も削除中にリネームできない!が発生しうるため、ロック方式、リネーム方式どちらも変わらないということでしょうか。 また、②登録データの更新のケースで、自分のシステム(B)が取得・削除した後に、再度受付データが送られてきた場合は、再度取得を行い、自分のシステム(B)が取り込んだデータを上書きで更新するしかないと考えています。 また、Aシステムからは随時で連携されてくるため、1日のうちに何回も更新される見込みです。環境について追記しました。
guest

0

ごめんなさい、質問の意図がよくわからないのですが、単にファイルをロックすればよいだけでは?

投稿2026/03/17 03:59

yambejp

総合スコア118398

keisukestrat

2026/03/19 09:29

ご確認ありがとうございます。 ファイルをロックにしてもファイルそのものをロックする方法やロックファイルを作成して判断する方法があるかと思い、そもそも私自身で考えていることが一般的なのか?ということもあり、今回質問させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問