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

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

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

Re[8]: C# パスの結合について。


(過去ログ 104 を表示中)

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

■62169 / inTopicNo.1)  C# パスの結合について。
  
□投稿者/ 初心者アリス (22回)-(2011/09/26(Mon) 16:09:53)

分類:[.NET 全般] 

C# VS2008

いつもお世話になっています・ω・
またどうしても分からない事が出来てしまったので、
教えて頂けないでしょうか・△・;

前提として、以下のようにDir元の\新しいフォルダー以下を
ディレクトリーコピーでDir先に同じ階層になるように作成しています。

 Dir元 c:\test\新しいフォルダー\新しいフォルダー2
 Dir先 c:\test2\新しいフォルダー\新しいフォルダー2

フォーム内テキストボックスの値
 this.txtMoto.Text = c:\test\新しいフォルダー\新しいフォルダー2
 this.txtSaki.Text = c:\test2

ソース
 string stPathName = System.IO.Path.GetDirectoryName(this.txtMoto.Text);
 string stCopyTo = System.IO.Path.Combine(this.txtSaki.Text, System.IO.Path.GetFileName(stPathName));
 xmlDoc.Save(stCopyTo + @"\" + stfilename); stfilenameは引数で値を取得しています


求める結果
 stCopyToを結果として以下のようにしたいです。
 stCopyTo = c:\test2\新しいフォルダー\新しいフォルダー2
 ただ、フォルダーの名前や階層は変動する為に、固定ではありません。
 (固定であればまだできるのですが……)

ソースで行った結果
 System.IO.Path.Combineを使用してみたのですが、結果は以下になりました。
 stCopyTo = c:\test2\新しいフォルダー

そもそもSystem.IO.Path.Combineの使い方がおかしいのだと自分でも思っているのですが、
他に方法が思い付かず悩んでいます。
何か良い方法があれば教えて頂けると助かります><

よろしくお願いします。
引用返信 編集キー/
■62170 / inTopicNo.2)  Re[1]: C# パスの結合について。
□投稿者/ shu (1012回)-(2011/09/26(Mon) 16:32:55)
No62169 (初心者アリス さん) に返信

this.txtMoto.Text.Replace(@"c:\test",@"c:\test2")
はどう?
引用返信 編集キー/
■62173 / inTopicNo.3)  Re[2]: C# パスの結合について。
□投稿者/ みきぬ (987回)-(2011/09/26(Mon) 17:41:17)
No62170 (shu さん) に返信
> ■No62169 (初心者アリス さん) に返信
>
> this.txtMoto.Text.Replace(@"c:\test",@"c:\test2")
> はどう?

その c:\test をどうやって求めればよいのか、という話じゃない?
元の文字列から「\新しいフォルダー\」という部分文字列を探して、見つかったらその手前までを取り出す、とか。
引用返信 編集キー/
■62174 / inTopicNo.4)  Re[1]: C# パスの結合について。
□投稿者/ PATIO (125回)-(2011/09/26(Mon) 17:42:47)
No62169 (初心者アリス さん) に返信

> ソース
>  string stPathName = System.IO.Path.GetDirectoryName(this.txtMoto.Text);
>  string stCopyTo = System.IO.Path.Combine(this.txtSaki.Text, System.IO.Path.GetFileName(stPathName));
>  xmlDoc.Save(stCopyTo + @"\" + stfilename); stfilenameは引数で値を取得しています

段階的に確認しましたか?
せっかく便利なデバッガがついた開発環境を使っているのに
使っていないとしたら勿体ないです。
あと、System.IO.Path.GetFileName(stPathName)ですけれど、なんか矛盾を感じます。
上のプログラム通りだとするとstPathNameの中にファイル名は含まれないのでは?
System.IO.Path.GetFileName(stPathName)が返している結果はどうなっているのでしょう?

引用返信 編集キー/
■62176 / inTopicNo.5)  Re[3]: C# パスの結合について。
□投稿者/ shu (1013回)-(2011/09/26(Mon) 18:18:31)
No62173 (みきぬ さん) に返信
> ■No62170 (shu さん) に返信
>>■No62169 (初心者アリス さん) に返信
>>
>>this.txtMoto.Text.Replace(@"c:\test",@"c:\test2")
>>はどう?
>
> その c:\test をどうやって求めればよいのか、という話じゃない?
> 元の文字列から「\新しいフォルダー\」という部分文字列を探して、見つかったらその手前までを取り出す、とか。

c:\testが不明だとすると結構ややこしいですね。


> this.txtMoto.Text = c:\test\新しいフォルダー\新しいフォルダー2
> this.txtSaki.Text = c:\test2
この情報から考えられるコピー先は

c:\test2\test\新しいフォルダー\新しいフォルダー2
c:\test2\新しいフォルダー\新しいフォルダー2
c:\test2\新しいフォルダー2
c:\test2

の4通り発生してしまいます。想定した内容を得るにはなんらかの規則が必要になりますね。

引用返信 編集キー/
■62177 / inTopicNo.6)  Re[1]: C# パスの結合について。
□投稿者/ みきぬ (988回)-(2011/09/26(Mon) 18:38:18)
No62169 (初心者アリス さん) より引用
> 前提として、以下のようにDir元の\新しいフォルダー以下を
> ディレクトリーコピーでDir先に同じ階層になるように作成しています。

てのがその規則なのだと思われ。
引用返信 編集キー/
■62178 / inTopicNo.7)  Re[2]: C# パスの結合について。
□投稿者/ PATIO (126回)-(2011/09/26(Mon) 19:53:44)
2011/09/26(Mon) 19:54:51 編集(投稿者)

No62177 (みきぬ さん) に返信
> ■No62169 (初心者アリス さん) より引用
>>前提として、以下のようにDir元の\新しいフォルダー以下を
>>ディレクトリーコピーでDir先に同じ階層になるように作成しています。
>
> てのがその規則なのだと思われ。

文章で書いてある内容とコードで示されている内容に微妙な違いがあるような気がします。
なので、そこの所をより明確にした方が良いですね。

多分の範疇で書きますが、今の例だけを見るとコピー元の二番目のフォルダー配下を
コピー先フォルダーの配下に作成するように見えます。
書かれている内容からだけ考えると再現されるのはコピー元の二番目のフォルダー配下の
フォルダーの階層構造と指定された最下層以降の全ファイルなのかなと言う気がしています。

で、コピー元の二番目のフォルダー配下と言う部分は固定で良いの?と言う部分とか
コピー先のフォルダー指定が何階層かあった場合にその下にコピー元の二番目のフォルダー配下の
フォルダーの階層構造を再現して良いの?とか
実は細かい事を言い出すと結構不明点があるように感じます。

その辺の不明点をはっきりさせた上でないと方法論もきちんとは出ないような気がしますね。
ちなみにC#で提供されているパス関連のメソッドのみで何とかなるのかと言うとそういうわけでは
無いような気がします。自分で文字列を走査して切った貼ったが必要になりそうな。

何にしてもデバッガで動作を確認しつつ、動かしてみる事をお勧めします。
自分が書いたコードがどんな風に動いているのかを把握するのはとても大事だと思います。

引用返信 編集キー/
■62181 / inTopicNo.8)  Re[2]: C# パスの結合について。
□投稿者/ shu (1014回)-(2011/09/26(Mon) 22:33:55)
No62177 (みきぬ さん) に返信
> ■No62169 (初心者アリス さん) より引用
>>前提として、以下のようにDir元の\新しいフォルダー以下を
>>ディレクトリーコピーでDir先に同じ階層になるように作成しています。
>
> てのがその規則なのだと思われ。
これって『新しいフォルダー』っていうとこは固定ではなく例にあるところの『新しいフォルダー』
以下という意味であって『新しいフォルダー』は別の名前になることはないのでしょうか?
固定のフォルダ名であるならみきぬ さんの方法で良いと思います。
引用返信 編集キー/
■62185 / inTopicNo.9)  Re[3]: C# パスの結合について。
□投稿者/ shu (1016回)-(2011/09/27(Tue) 07:49:56)
みきぬ さんの方法を正規表現置換で

Regex.Replace(textBox1.Text, @".:\\.*?(?=\\新しいフォルダー\\)", textBox2.Text)

ローカルパスのみ対応、最初に現われる新しいフォルダー以下の階層が同じと仮定



引用返信 編集キー/
■62186 / inTopicNo.10)  Re[4]: C# パスの結合について。
□投稿者/ 初心者アリス (24回)-(2011/09/27(Tue) 09:02:50)
お答えして頂いたみなさんへ・ω・☆

返信が遅くなった事、
それから、私の質問内容に多々不足や不明、おかしな点もあり
大変迷惑をかけしてしまいすいませんでした……。

やらなければいけない事は分かっているのですが、
それを説明しようとなるとどう説明して良いのか
まとまらない状況です。

考えをまとめて、あと、デバッガを使って再度動きを確認して
出直してこようと思います・△・;

また再チャレンジに来ると思いますが、
本当にありがとうございました><

ややこしくなると考えられるので、一応「解決済み」にしておきます。
解決済み
引用返信 編集キー/
■62191 / inTopicNo.11)  Re[5]: C# パスの結合について。
□投稿者/ マサヤ (349回)-(2011/09/27(Tue) 12:36:08)
コピー先の2階層目までは既に存在すると考えて、それ以降を作成するのでしょうか?
こんな感じですか?
            string motoFolder = @"C:\test\a\hoge";
            string publishBaseFolder = @"C:\test2";
            DirectoryInfo motoDirectory = new DirectoryInfo(motoFolder);
            char divideChar = '\\';
            string[] dividingDriver = motoFolder.Split(divideChar);
            for (int i = 0; i < dividingDriver.Length; i++)
            {
                if (i > 1)
                {
                    publishBaseFolder += '\\' + dividingDriver[i].ToString().Trim();
                }
            }

            DirectoryInfo publishDirectory = new DirectoryInfo(publishBaseFolder);
            
            if (publishDirectory.Exists == false)
            {
                publishDirectory.Create();
                publishDirectory.Attributes = motoDirectory.Attributes;
            }

            foreach (FileInfo fileInfo in motoDirectory.GetFiles())
            {
                //同じファイルが存在していたら、常に上書きする
                fileInfo.CopyTo(publishDirectory.FullName + @"\" + fileInfo.Name, true);
            }

解決済み
引用返信 編集キー/
■62193 / inTopicNo.12)  Re[6]: C# パスの結合について。
□投稿者/ 初心者アリス (25回)-(2011/09/27(Tue) 16:39:02)
No62191 (マサヤ さん) に返信
>マサヤさん
解決済みにしてある文に返信をしてもらいありがとうございました。・ω・。


私の説明に不足がある為、いかに、再度、まとめてみました。

↓ここから始まります↓
読み込み元フォルダーが以下のようにあります。
C:\moto\motoFol1\テキスト.txt
  \motoFol2\Fol2-2\テキスト2.txt
  \motoFol3
  \motoFol4\テキスト3.txt

ディレクトリーコピーで
指定フォルダー先へC:\moto配下のディレクトリー構造をコピーしています。
↓ディレクトリー構造コピー前の指定フォルダー先
C:\saki
↓ディレクトリー構造コピー後
C:\saki\motoFol1
  \motoFol2\Fol2-2
  \motoFol3
  \motoFol4

その後、フォルダー参照ダイアログから読み込み元フォルダーを指定し、
.txtファイルがあるなら読み込み書き換え、
指定先のフォルダーへ保存をすると行った処理をしています。
(サブフォルダー内も含みます)

行いたい事
C:\moto\motoFol1\テキスト.txtの内容を読み込み書き換えて
C:\saki\motoFol1へ保存。

C:\moto\motoFol1\\motoFol2\Fol2-2\テキスト2.txtの内容を書き換えて
C:\saki\motoFol2\Fol2-2へ保存。

C:\moto\motoFol4\テキスト3.txtの内容を読み込み書き換えて
C:\saki\motoFol4へ保存。

と言ったように、C:\motoに存在するファイルの数だけ同じように
ファイルを読み書き換えて、保存を行います。

★最終的には
C:\saki配下のディレクトリー構造が
元フォルダー構造(ファイル名も含む)と同じになるように処理を行いたいです。
各ファイルの中身は書き換えているので、C:\motoの内容とは違います。
C:\saki\motoFol1\テキスト.txt
  \motoFol2\Fol2-2\テキスト2.txt
  \motoFol3
  \motoFol4\テキスト3.txt

※ユーザーが作成したフォルダーになる為、
 読み込み元フォルダー、保存先フォルダーともに、フォルダ名やパス、構造は
 固定では無く、変動します。

例----------------------------------------------------------------------
読み込み元フォルダーが以下のようにあります。
C:\moto_2\motoFol_1\テキスト.txt
   \motoFol_2\Fol2-2\テキスト2.txt
   \motoFol_3
   \motoFol_4\Fol4-2\Fol4-3\テキスト3.txt

ディレクトリーコピーで
指定フォルダー先へC:\moto_2配下のディレクトリー構造をコピーしています。
↓ディレクトリー構造コピー前
D:\saki_2\saki
↓ディレクトリー構造コピー後
D:\saki_2\saki\motoFol_1
      \motoFol_2\Fol2-2
      \motoFol_3
      \motoFol_4\Fol4-2\Fol4-3

最終的には
D:\saki_2\saki\motoFol_1\テキスト.txt
     \motoFol_2\Fol2-2\テキスト2.txt
      \motoFol_3
      \motoFol_4\Fol4-2\Fol4-3\テキスト3.txt

例終わり-----------------------------------------------------------------


現在は、保存先フォルダーへのディレクトリー構造のコピーは出来ています。
それと、読み込み元フォルダーに入っている各ファイルを読み込んで、保存先
フォルダーへ保存する事は出来ています。
保存後はとりあえずとして全て指定先フォルダー直下へ、ファイルを保存しています。

どうしても「★最終的には」のようにファイルを保存する方法が思い付かず
悩んでいる状態です・△・;

解決済みになっていますが、
デバッガで処理を追いかけてみましたが、
そう単純な事では解決しそうに無い感じがするので、
もしご覧になられた方がいて、何かすらヒントを頂けたら幸いです。

初めに書いたソースも意図しない部分を取得していました……。
悩み過ぎて夢に見そうな気配です・△・;
引用返信 編集キー/
■62199 / inTopicNo.13)  Re[7]: C# パスの結合について。
□投稿者/ ペイリン (8回)-(2011/09/28(Wed) 00:14:02)
> 現在は、保存先フォルダーへのディレクトリー構造のコピーは出来ています。
> それと、読み込み元フォルダーに入っている各ファイルを読み込んで、保存先
> フォルダーへ保存する事は出来ています。
> 保存後はとりあえずとして全て指定先フォルダー直下へ、ファイルを保存しています。

まで出来ているのであれば、

> どうしても「★最終的には」のようにファイルを保存する方法が思い付かず

元ファイルを書き換えて保存先に保存するんじゃなくって、保存先にコピーしたファイルを書き換えて上書き保存すればいいんじゃないですか?
引用返信 編集キー/
■62202 / inTopicNo.14)  Re[8]: C# パスの結合について。
□投稿者/ 初心者アリス (27回)-(2011/09/28(Wed) 10:13:58)
No62199 (ペイリン さん) に返信
ペイリンさん

返信ありがとうございました><
おかげ様で、出来ましたー。・ω・。☆
あれだけ悩んだのに10分程で・△・;
私の閃きの悪さに心なしかショック……。

そして、お答えして頂いた皆さん。
拙い説明にも関わらず返信して頂きありがとうございましたT△T♪
感謝感謝ですっ!

プログラミングと言うものを始めて2か月余りですが、
ようやく今作っている物が、完成に近づき、ちょっと達成感です≧ω≦
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -