いつもお世話になっております。
今回は、ファイルの複数移動について考えております。
For Eachで複数回できるみたいなのですが、いまいちイメージがつかめません。
作成したい理想イメージとしましては、
Aフォルダ内に以下3つのファイルが存在した場合
「aファイル、bファイル、cファイル」
bとcのファイルのみコピーし別フォルダにペーストさせたい所存です。
移動させるファイルは2つなので「ファイルをコピー」アクティビティを2つ作成したら可能なのですが、後学のためFor Eachで作成したいと考えています。
また、bファイルの名前の頭5文字が一致したら移動するという
プログラムの記述方法もご存じの方はご教示お願いいたします。
(例)“あいうえおかきくけこ.text” → "あいうえお"一致したから移動!
のような処理を行いたいです。
※“ファイルパス+頭5文字のファイル名” + 「*(アスタリスク)」
で行いましたところ不発でした。。。
以上、よろしくお願いいたします。

HANACCHI
(はなっち!UiPath Japan MVP 2019-2022)
2
純粋にフルパスのフォルダ情報(“A”)から、ファイル名を取得する方法だと、
System.io.path.GetFileName(“A”)
で取得できます。
コピー対象外とするファイル情報が固定なら、
System.io.path.GetFileName(“A”).Equals(“aファイル”)
がTrueの時に、コピー対象外に出来ますね。
これに先頭5文字が。。。って条件を加えると、
System.io.path.GetFileName(“A”).Substring(0,5).Equals(“あいうえお”)
となります。
もし、ファイル拡張子でコピー対象を判断するのでしたら、
System.io.path.GetExtension(“A”)
でファイル拡張子が取れます。
1 Like
HANACCHI
(はなっち!UiPath Japan MVP 2019-2022)
4
いえ、●●の箇所ではなく、Bodyの中に、条件分岐を入れてあげ、Falseのところにファイルコピーの処理を記述します。
※System.io.path.GetFileName(“A”).Substring(0,5).Equals(“あいうえお”)
の結果値はTrueかFalseになります。
同様に、System.io.path.GetFileName(“A”).Equals(“aファイル”)も条件分岐のFalseのところにファイルコピーの処理を記述します。
対象外とするファイルをどの様に管理、利用するかによって条件分岐のConditionに記述する式は変わりますが、今の質問の範囲では、条件分岐を連ねる方法でいいと考えます
HANACCHI
(はなっち!UiPath Japan MVP 2019-2022)
6
ん~~、多分GetFileName(“フォルダ名”)は、GetFileName(item.ToString)になるかと。。。
For Each でコレンションを指定したら、itemには、その一つ一つが渡されます。ですので、フルパスのファイル名情報がitemに格納されます
1 Like
_Chuki
(Chuki Tadayoshi Manabe(眞鍋 忠喜))
7
GetFileName ってフルパスから拡張子付きのファイル名取ってくるメソッドですが、なぜそれをFor Eachで回すんですか?
フォルダのフルパス一覧は、最初に出ている通り Directory.GetFiles メソッドですね。
Stringの配列が返ってくるのでFor eachなどで各フルパスを処理してください。
あと、ダラダラ長くすると、どこがダメなのかわからなくなるのでちゃんと代入したほうが良いですよ。
Foreach [szFilePath (String) ] in [System.IO.Directory.GetFiles (“フォルダ名”)])
szFileName = Path.GetFileName(szFilePath )
szFilePreName = szFileName.Substring(0,5)
szFilePreName.Equals(“あいうえお”)
とか分けておくと、デバッグ実行すればどこがおかしいかすぐわかります。
ともかく、.NETのメソッドの説明をお読みになるのが初心者脱出の近道ですよ^^
「 Path.GetFileName メソッド」
「Directory.GetFiles メソッド」
2 Likes
_Chuki
(Chuki Tadayoshi Manabe(眞鍋 忠喜))
9
すいません、r-chinenさんが考えるスマートな表記というのがどういう状態なのか想像できないので何とも。シーケンスに名前つけてその中で複数の代入処理を実施し普段は折り畳んでおくとかしておくと散らばっては見えなくなるので私はそうするか、または別ファイルに分けています。別ファイルに分けるとテストしやすいので。
あと、エラーが出たといわれても、どのように書いてどのようなエラーが出たのかが分からないのでなんとも・・・。
もし、既定値の右辺値に変数を入れてるのなら、その時点で確実に既定値に入れている変数に値が入っているかどうかを確認してください。なんとなく想像するに、変数パネルでスコープが内側だけの別の同名の変数を作って代入しようとしているように見えます。宣言したときに別の変数ができるのでどんな動きをするのか想像できません。
_Chuki
(Chuki Tadayoshi Manabe(眞鍋 忠喜))
11
【エラー】
条件分岐: インデックスおよび長さは文字列内の場所を参照しなければなりません。
パラメーター名:length
条件分岐のアクティビティが赤枠になってエラーが出ているということは、たぶんそのアクティビティで設定している変数の内容がおかしいのだと思います。条件式を確認してみてください。
おそらく、5文字以下のファイルが含まれているのだと思います。
その場合は、5文字切り取ろうとして、そんな場所ないよと怒られています。
対応案を2つほど
1.事前に文字数が5文字以上か判定する
例:szFilePreName.Length < 5 の条件で判定を抜ける
2.比較しようとする文字列に無理やり文字を足して判定する
例:szFilePreName = (szFileName & “00000”).Substring(0,5)
※前後は同じ
※_Chukiさんのおっしゃる
>ダラダラ長くすると、どこがダメなのかわからなくなるのでちゃんと代入したほうが良いですよ。
というTipsが見事に効いてますね。。
1 Like
_Chuki
(Chuki Tadayoshi Manabe(眞鍋 忠喜))
15
条件分岐については要件が不明なのでアレですが多分あってそう。
エラーが出る原因はすでに指摘のある通りファイル名に5文字以下のものがあるのではないかと想像します。
エラーが出る直前の行で1行書き込みアクティビティでファイル名を書き出してみてはいかがでしょうか。
また、ファイル名の一覧作成時にワイルドカード使って絞り込む方法についてブログ化したのでもしご参考になれば。
前提:
beforeフォルダに
abc.txt
aaabbbccc.txt
aaabbbeee.txt
ファイルがある場合に
afterフォルダに
aaabbbccc.txt
aaabbbeee.txt
を移動させたいとしました。
ふまえて、sampleを作成してみました。
sample.zip (2.7 キロバイト)
※ほぼ回答を順番にならべただけですが。。。
_Chukiさんの回答より
Foreach [szFilePath (String) ] in [System.IO.Directory.GetFiles (“フォルダ名”)]
HANACCHIさんの回答より
szFileName = Path.GetFileName(szFilePath )
私の回答から
szFilePreName = (szFileName & “00000”).Substring(0,5)
r-chinenさんの書き込みから
※一部意訳していますが。。
【条件分岐】
sp2FilePreName.Equals(“該当するファイル8文字”)
Then ファイルの移動処理
Else 処理なし
↓
【ファイルの移動処理】
移動元
ファルダA.ファイルabcパス
移動先
フォルダB.ファイルabcパス
2 Likes
_Chuki
(Chuki Tadayoshi Manabe(眞鍋 忠喜))
19
あえて、書いてないのか違う書き方をしたのが存じませんが、その上側のGetFilesでファイルの一覧を取得してループしていると存じます。この時繰り返し処理の各行を受る変数(szFilePath)にはフルパスが入っているので、これを移動に使えば済むように見えました。
1 Like
system
(system)
Closed
22
This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.