質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.91%

ヒントがほしい...

解決済

回答 4

投稿

  • 評価
  • クリップ 2
  • VIEW 907

BeatStar

score 1792

C/C++ ( Windows API 実装あり ) でやっています。

同期プログラム のようなものを作ろうかと思っています。
同期対象は iniファイルに記述するか、
自分用としてプログラムが指定するようなものです。

また手を付けていないですが、迷っている部分があります。

対象はプログラムが指定する方だとしても、
私の考えでは

更新先の削除 -> コピー

です。

ここまではいいのですが、問題は"更新元の決定" と "更新先の決定" です。

たとえば

C:\test\Checker\

リムーバブルディスク ( USB ) として
M:\Checker\

があるとします。

この"Checker"ディレクトリ内のファイルを更新するとします。

ですけど

C: -> M:

C: <- M:

の2通りありますね。

これをどうやって決めるかです。

たとえば、

自宅のPC ( 以下 H-PC ) に ファイルやディレクトリ ( 以下 対象 )を作成するなりインストールするなりします。
そのファイルやディレクトリを USBにコピーします。
このUSBを外出先で使用して更新があったとします。
USBを持ち帰って H-PC 内の 対象 を更新ソフトで更新します。
その更新状態のH-PCの 対象 をさらに編集します。
その状態 ( 編集後 ) を 更新ソフト で更新します。
...

というような感じです。

一応、私の知識( 聞いたことがある方法等 ) では、

■ コマンドラインで指定する方法

■ ユーザ入力による指定で決定する方法

■ ファイルやディレクトリの「更新日時」に相当するものをチェックして最新の方を更新元とする方法

です。

コマンドラインの方だと、

ファイル名すら未決定なので main.exe とします。( 例なので。 )

$rem -o = OUTPUT, -i = INPUT
$main -o 更新先 -i 更新元

のようにするとかです。

ユーザ入力... これは CUI なら cin とか gets関数とかで、GUI なら EDIT等のコントロール 等です。

更新日時を取得する方法は知らないですが、「Windows API 更新日時 取得」のように検索すればわかると思いますので、
取得方法が知りたいというわけではないです。
( 「取得できるデータと実際のデータが食い違う場合がある」等のように注意が必要な場合はその注意もですが。 )

知りたいことは、

普通はこういう場合はどういう風に元/先 を決定するのか

です。

できればダブルクリックで完了するようにしたいので、

ユーザ入力は やらないと思います。(多分。)

コマンドライン引数の場合は バッチファイルに書いておけばいいですし。ですけど、C->M と M->C の2つ用意しないといけないか、
バッチファイル内で IFで 分岐しないといけないので、ほぼユーザ入力と変わらない...

[環境等]
言語       : C/C++
Windows API: あり
コンパイラ : MinGW ( g++ )

宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+1

こんにちは。

普通はこういう場合はどういう風に元/先 を決定するのか

このケースでは「普通」ってないと思います。
そのソフトウェアの使う場面を想定して一番使い勝手の良い方法で実装することになります。

そして、その使い方であれば、

ファイルやディレクトリの「更新日時」に相当するものをチェックして最新の方を更新元とする方法

が便利と思います。

両方同時に更新してしまうと片方の更新が失われる問題は残りますが、この問題を解決したソフトを作るのは非常に難易度高いです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

普通?!普通って…なんだ…
普通が重要な案件に思えないんですが。

姿形の無い「普通」というものに捕らわれないことです。
自分なりの使いやすさに注目しましょう。

とりあえず元先の決定方法…
元のファイルパスと先のファイルパスでいいんじゃないですかね。
もしかして想定がもっと難しいのかもしれませんが。
どうしても普通に拘るならLinuxの標準コマンド群を参考にするといいです。
例;ファイルコピーのコマンドです。
Linuxではcp [options] src dstになってますね。

例えばコンソールプログラムで名前がmycopyだとしましょう。
mainよりは今回やりたいことに相応しい気がするよね

このmycopyの仕様を考えるわけです。
mycopy src dst
Linuxと同じですが、これで十分ですよね。

-iとか-oとかは今後引数が増えた場合には必要ですが、単一目的のプログラムを作る場合、大体そういう引数は「オプション」です。
今回みたいに動作が確定している場合別に1番目の引数と2番目の引数で十分だと思います。

それから、更新日見て判定して、新しければコピーしてくるという動作のバッチプログラムを作ったとしたら…

バッチ内にC->MM->C並べて書いても問題無いですよね。

①CとMが同じ場合
`C->M`は無視される。
`M->C`は無視される。

②Cの方がMより新しい場合
`C->M`は無視される。(Mの方が古い。)
`M->C`はコピーされる。

③Mの方がCより新しい場合
`C->M`はコピーされる。
`M->C`は無視される。(ファイルが同じ)

それでも2行書くのが煩わしいので、オプションに双方向を示すものを付けるぐらいはしていいかもしれません。
mycopy -b src dst
-bは適当です、both directionとかね。なんでもいいんです。
ここでもとりあえず自然な命名は暫くは考えないようにしましょう。
人によって差があるので、そもそも「普通」は存在しませんしね。
自分なりの判断基準を作るのは自由ですけどね。


ところで、こういう動作はWindowsならOneDrive使えばクラウドでやってくれますよ。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

基本的には更新日時で良いと思います。
ついでに一つ前の更新日時、ファイルサイズを記録しておいて、CとMに両方更新があることがわかった場合にはユーザーに選ばせるか両方バックアップを取るなどするのが安心じゃないでしょうか?

rsyncというソフトがあるのでぜひ使ってみて機能だとか使い勝手を参考にしてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

タイムスタンプ比較して同期するだけなら、Windows標準のXCOPYコマンドで済む話です。
機能要件、非機能要件をもう少し突き詰めないと、なんとも言いがたいところですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る