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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

1848閲覧

ヒントがほしい...

BeatStar

総合スコア4958

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

2クリップ

投稿2017/04/24 02:00

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++ )

宜しくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

こんにちは。

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

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

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

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

が便利と思います。

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

投稿2017/04/24 02:18

編集2017/04/24 02:19
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2017/04/24 20:59

Kunihiro_Narita

総合スコア472

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2017/04/24 06:11

nullbot

総合スコア910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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使えばクラウドでやってくれますよ。

投稿2017/04/24 02:33

編集2017/04/24 02:37
haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問