C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: C#でディレクトリを維持したままコピーしたい


(過去ログ 121 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■72775 / inTopicNo.1)  C#でディレクトリを維持したままコピーしたい
  
□投稿者/ pod (6回)-(2014/07/14(Mon) 19:56:59)

分類:[C#] 

コピー元とコピー先の親ディレクトリが設定されていて、コピー元のディレクトリ以下にあるファイルをコピー先にコピーしようと思います。その際、ファイルがディレクトリに入っている場合はコピー先にも同名のディレクトリを作ってからコピーしたいです。

例えば、
「C:\〜\target」がコピー元で「C:\〜\dest」がコピー先のディレクトリとなっている時、
「C:\〜\target\images\sample.jpg」は「C:\〜\dest\images\sample.jpg」となるようにコピーします。

ファイルの絶対パスから親ディレクトリからの相対パス(images\sample.jpg)を取得し、
コピー先もその相対パスと同じ構造になるようにするにはどのようにすればいいのでしょうか?

それぞれの親ディレクトリは FolderBrowserDialog を使って指定するので固定ではありません。
引用返信 編集キー/
■72777 / inTopicNo.2)  Re[1]: C#でディレクトリを維持したままコピーしたい
□投稿者/ 魔界の仮面弁士 (50回)-(2014/07/14(Mon) 21:15:19)
2014/07/15(Tue) 14:46:18 編集(投稿者)

No72775 (pod さん) に返信
> ファイルの絶対パスから親ディレクトリからの相対パス(images\sample.jpg)を取得し、
> コピー先もその相対パスと同じ構造になるようにするにはどのようにすればいいのでしょうか?

とりあえず思いついたのは、こういった流れですね。

1) 絶対パスと基準パスから、相対パスを取得する。
2) それをコピー先ディレクトリに対して Path.Combine 等で結合し、コピー先の絶対パスを得る。

相対パスを求めるサンプルについては、google ってみたら下記がヒットしました。
http://www.itlab51.com/?p=2092
http://sky.geocities.jp/freakish_osprey/CsTips/CsTips_relative_path.htm


> 「C:\〜\target」がコピー元で「C:\〜\dest」がコピー先のディレクトリとなっている時、
> 「C:\〜\target\images\sample.jpg」は「C:\〜\dest\images\sample.jpg」となるようにコピーします。
いろいろな方法があるとは思いますが、一例として。

string コピー先 = @"C:\〜\dest\";
string コピー元 = @"C:\〜\target\";
string 元ファイル = @"C:\〜\target\images\sample.jpg";

Uri a = new Uri(コピー元);
Uri b = new Uri(元ファイル);
Uri c = a.MakeRelativeUri(b);

Uri x = new Uri(コピー先);
Uri y = new Uri(x, c);

// string 結果パス = @"C:\〜\dest\images\sample.jpg";
string 結果パス = (Uri.UnescapeDataString(y.LocalPath) + Uri.UnescapeDataString(y.Fragment));



---- 以下蛇足 ----

Windows 98 では "A.TXT" と "a.TXT" が区別されますが
Windows 2000 では同一視されます。

ファイル名でもディレクトリ名でも同様ですので、
相対パスを作成する場合にはご注意ください。

今更 Win9x ということも無いと思いますが、念のため。

# Win98 で使用していた FAT32 ドライブを、現行 OS に
# 接続して開いた場合、これが原因でファイルの取り違いが
# 発生するという事故が…。
引用返信 編集キー/
■72785 / inTopicNo.3)  Re[1]: C#でディレクトリを維持したままコピーしたい
□投稿者/ kiku (35回)-(2014/07/15(Tue) 19:59:30)

DOSコマンドになりますが
XCOPY使えないでしょうか?

http://www.k-tanaka.net/cmd/xcopy.php

だいぶ昔に使ったことがあるんですが、
オプションいろいろ設定して目的の動作を
達成したことがあります。

要求の仕様は、満たすんじゃないかと思うんですが
動作検証はしていないのでテストしてみてください。
引用返信 編集キー/
■72787 / inTopicNo.4)  Re[1]: C#でディレクトリを維持したままコピーしたい
□投稿者/ Jitta (150回)-(2014/07/15(Tue) 20:46:29)
No72775 (pod さん) に返信

> ファイルの絶対パスから親ディレクトリからの相対パス(images\sample.jpg)を取得し、
> コピー先もその相対パスと同じ構造になるようにするにはどのようにすればいいのでしょうか?

 なぜそのように、難しく考えるのでしょうか。
C:\Users\MyName\Documents\images の下全てを、D:\Backup にコピーします。
リストを書いてみればすぐにわかりますが、コピー元のファイル パスは、か な ら ず C:\Users\MyName\Documents\Images から始まります。
ですから、この文字列の長さだけ後ろだけ部分文字列を取れば、コピー元からの相対パスになります。

 同じように、コピー先には、コピー先の一番上にその相対パスをつなげれば、コピー先のフル パスになります。

相対パス = コピー元フルパス.SubString(コピー元ルートパス.Length + 1);
コピー先フルパス = System.IO.Path.Combine(コピー先ルートパス, 相対パス);


 robocopy とか、SHFileOperation API とか、Sync Framework とか利用するのも良いかも。
引用返信 編集キー/
■72793 / inTopicNo.5)  Re[2]: C#でディレクトリを維持したままコピーしたい
□投稿者/ pod (7回)-(2014/07/16(Wed) 16:27:39)
No72777 (魔界の仮面弁士 さん) に返信

書いて頂いたサンプルで正しく動作しました。
PathではなくてUriを使うんですね。

今のところVista以上での動作を想定しているので大文字小文字の区別は大丈夫そうですが
比較の際の混在に気をつけようと思います。

ありがとうございます。
引用返信 編集キー/
■72794 / inTopicNo.6)  Re[2]: C#でディレクトリを維持したままコピーしたい
□投稿者/ pod (8回)-(2014/07/16(Wed) 16:31:02)
No72785 (kiku さん) に返信
>
> DOSコマンドになりますが
> XCOPY使えないでしょうか?

返信ありがとうございます。
最初FileInfo.Directory.Create()でディレクトリを作ろうと思っていましたが
こちらのコマンドを使えば一発で出来るのですね。
例外発生時のパースが難しそうですが目的を果たすにはちょうど良さそうです。
引用返信 編集キー/
■72795 / inTopicNo.7)  Re[2]: C#でディレクトリを維持したままコピーしたい
□投稿者/ pod (9回)-(2014/07/16(Wed) 16:35:05)
No72787 (Jitta さん) に返信
>  なぜそのように、難しく考えるのでしょうか。
> C:\Users\MyName\Documents\images の下全てを、D:\Backup にコピーします。
> リストを書いてみればすぐにわかりますが、コピー元のファイル パスは、か な ら ず C:\Users\MyName\Documents\Images から始まります。
> ですから、この文字列の長さだけ後ろだけ部分文字列を取れば、コピー元からの相対パスになります。

言われてみればたしかにそのとおりでした。
シンプルな手段ですが特にデメリットもなさそうなので組み込んで試してみようと思います。
ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -