フォルダ内の全エクセルファイル名を正常に取得する方法

こんにちは

所定のフォルダ内のエクセルの全ファイル名を取得しようとしたとき、
ファイル名が~$で始まる一時ファイル名も持ってきてしまいます。
現在for eachにsystem.IO.Directory.GetFiles()を使用してファイル名を取得しているのですが、
どのようにすれば実際に存在するファイルのみ取得できるでしょうか?

@basashi5さん

System.IO.Directory.GetFiles(path, “*.xlsx”))メッソトを試して見てください。

Directory.GetFilesのみでは条件に合致するものは取れますが、合致しないものを取る仕組みがありません。
関数からすると、一時ファイルであってもファイルであることには変わりないので、実装側で対応するほかないかと思われます。

1 Like

ファイルのプロパティで、隠しファイル属性かなんかで区別できないですかねぇ。。。

1 Like

コンピューターローカルであれば問題ないかもしれないです。
ただしネットワーク上のファイルサーバーの場合、(そのファイルサーバーの仕様次第かもしれませんが)隠しファイルにならないケースを何度か見かけているので確実とは言い切れないかもしれないですね。

1 Like

となると、Directory.GetFilesで得たフルパス情報からファイル名だけにし、
その先頭文字が"~"だったら処理対象としない。。。などのROBOT側の工夫は必至なんですね。φ(…)メモメモ

2 Likes

おそらくこんなかんじですね。

For Each filePath In Directory.GetFiles(folderPath, extensionsString) {
  If(not filePath.Contains("~$")){
    // 対象ファイルへの処理を実装する
  } else {
    // 対象外ファイルへの処理を実装する
    // (自分は「一時ファイルのためスキップします」みたいな文言いれます)
  }
}
2 Likes

みなさま

お返事ありがとうございます。
昨日立て込んでおり会話に混ざれず申し訳ないですm(__)m

HANACCHIさんがおっしゃったように
隠しファイル属性か何かで区別できれば最良ではあったのですが
最終的に提案頂いた方法で問題なく解決できました。

ありがとうございました。

1 Like

System.IO.Directory.GetFiles(folder, ext) にスパイスを加えて、

System.IO.Directory.GetFiles(“C:\TestData”, “*.xlsx”).AsEnumerable().Where(Function(f) Not Path.GetFileName(f).StartsWith("~$"))

のように、配列から余分なファイルを、除外する方法もありますね。
.NETの知識が必要になるので、人を選ぶかもしれませんが、ワークフローに煩雑な処理が入らなくなります。

1 Like

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.