皆もすなるQiitaといふものを、儂もしてみむとてするなり。
と言う訳で、こん**は!はなっち!です。
いくらロボットは何でもできる!と言われていても、ファイルに関する位置情報は教えてあげねばならない訳でして。。。
そのファイル位置情報は、「フルパス」と言ったりしますね。そうです。ドライブレターから始まり、フォルダ間を"¥"記号で連結し、最後にファイル名が記述されている。。。
この情報を基に、ロボットだったりプログラムだったりは、そのファイルへアクセスする訳ですね。
そのアクセスに必要なファイル位置情報は、ロボット内部に直接記述してしまうと、ファイル名を変えたい!格納先を変えたい!などの要望に即対応することが難しくなってしまいます。
そこでよく使われるのが、CONFIG.xlsx上にそれら情報を持たせ、ロボット内部では、そこから情報を得る方法ですね。
フォルダ位置と、ファイル名をそれぞれ連結するには、先のCONFIG.xlsxの例では、文字列の連結をすればいいですね。
フォルダ位置の指定で、末尾に"¥"記号がなく指定する人もいるかと思います。そういった場合には、陽に"¥"記号を付加したのち、ファイル名を連結してあげればいいのですが、それは手間ですね。
そういった場合に、System.IO.Path.Combineメソッドの出番です!
Path.Combineメソッドは、複数の文字列を1つのパスに結合するメソッドです。
ですので、先ほどのCONFIG.xlsxに持たせたフォルダ位置と、ファイル名をこのPath.Combineメソッドを使って、フルパスにしてから利用すればいいですね。
と、ここまではもう既にご存知のことと思います。
私もこのようにして「うまいこと」やってきました。
先日、同じフォルダに格納されている2つのファイルを扱うロボを作成していました。無論CONFIG.xlsxファイルに各情報を持たせています。
開発を進める最中に、2つ目のファイルは、指定フォルダの一つ下のサブフォルダに格納した方がいいなと思い、ファイル名の先頭に、"¥"記号とサブフォルダを追加したのです。
実行!成功!と思いきや!異常終了!
なんで?と思ったら、2つ目のファイルが存在しないとの事。。。
ログにそのファイル情報を出力すると、確かにフルパスの形式にはなっておらず…
なんでだろう。Combine(String, String)のそれぞれのString変数には、ちゃんと値が設定されているのに...
と言う記述があり...
メソッドの代わりに Combine 、 メソッドまたは メソッドの使用 Join を TryJoin 検討してください。
という記述を自動翻訳のミス!?ってんで、良く読んでいなかったのが敗因。
Combine メソッドの代わりに、Join メソッドまたは TryJoin メソッドの使用を検討してください。 が正解なんですね。
で、つまり、Combine(String, String)の最初のString変数には 絶対パス を指定し、以降のString変数には、 相対パス を指定しなければならないって訳ですね。
では、どうしたら便利に指定できるか...
相対パスを指定しなければならないところに、先頭に"¥"記号を付した場合にはおかしい挙動となったので、相対パスのところにの先頭に"¥"記号は除外してあげる。
相対パスの先頭の"¥"記号を除外しているので、絶対パスを指定しなければならないところには、その末尾に"¥"記号を付加してあげてはどうだろう?
ってんで、以下のような代入を考えてみました!
絶対パス(第1引数)
⇒CONFIG("入力フォルダ位置").ToString.TrimEnd("¥")&"¥"
⇒末尾の"¥"記号をトリムして、トリムした結果に、改めて"¥"記号を付加する
相対パス(第1引数以外)
⇒CONFIG("入力ファイル名1").ToString.TrimStart("¥")
⇒CONFIG("入力ファイル名2").ToString.TrimStart("¥")
⇒先頭の"¥"記号をトリムする
これらを施してから、Combine(String, String)で1つのパスに結合してあげればいいですね。
【教訓】
・CONFIG.xlsxに情報を格納させる場合、想定外の値が設定される場合がある事を考えよう
・フォルダ位置に関しては、確実に末尾に"¥"が付くようにしよう。
空振りしてもいいので、TrimEnd("¥")したのち、"¥"を連結する
・ファイル名(、サブフォルダ¥ファイル名)に関しては、先頭に"¥"が無いようにしよう。空振りしてもいいので、TrimStart("¥")する。
・各メソッドもプログラムの一部。使い方を確認しよう。
・自動翻訳を読み砕く力が必要!
##おわりに
いかがでした?
▼.NETは便利なメソッドが用意されています。これを利用する事は、効率的な開発が期待できます。
▼とはいえ、使用に際しては、注意事項は読み(多少のの忖度力は必要ですが)、理解する必要があります。
▼併せて、開発者が説明する、「設定方法はこうですよ」と言った話は守られない(開発者が注意事項を読まないように。。。)
▼ありとあらゆる場合をカヴァーは意味ないが、何かあったら実行者側で解決できるようなメッセージを出してあげる。
あるいは、問い合わせ窓口に問い合わせていただくような…
今回も読んでいただきありがとうございました!
是非UiPathでのロボ開発の一助になればと思っています。
ありがとうございました!