質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

10172閲覧

C# 指定文字列を含まない全てのファイルパスを取得したい

miiiiiiiisuke

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/04/28 02:39

前提・実現したいこと

指定したフォルダ内で、指定したワードを含まないファイルパスを取得したいです。
例: 指定フォルダ「A」 除外ワード「b」
\A\bbbb\CCCC.pdf ☚不要
\A\bbbb\DDDD.pdf ☚不要
\A\eeee\FFFF.pdf ☚要
\A\gggg\HHHH.pdf ☚要

初心者なりに考えた設計の流れ

1.Getfilesで一旦、指定フォルダ(txtFolderPath)以下全ファイルパス取得
2.Array配列を一旦リスト配列に変換する
(ネット情報で配列項目の削除をするにはリストにする必要があると見たので)
3.ListのRemoveを使って、要らない項目を削除
4.結果をlstFolderPathForSearchResultに表示

該当のソースコード

C#

1// 指定フォルダパス以下全てのファイルパスを取得 2String[] files = System.IO.Directory.GetFiles( 3 txtFolderPath.Text, "*" , System.IO.SearchOption.AllDirectories); 4 5// 除外ワード分の配列を削除 6var filesToList = new List<string>(); 7filesToList.AddRange(files); 8 9filesToList.Remove(//ここに除外ワードを含む項目を指定したいが分からない//); 10 11string[] new_src; 12new_src = filesToList.ToArray(); 13 14// 結果をリストに表示 15lstFolderPathForSearchResult.Items.AddRange(new_src);

3万件くらいあるファイルパスを取得します。

この処理の後の流れとしては、
リッチテキスト内に改行で指定された複数の文字列と
一致するファイルをコピペして集めてくる、というツールを作成していきます。
例:
FFFF 一致 \A\eeee\FFFF.pdf
GGGG 不一致
HHHH 一致 \A\gggg\HHHH.pdf

またこの件で質問させていただくと思いますが、
とりいそぎは上記コード分を教えていただけませんでしょうか。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/04/28 02:48

Remove ではできません。RemoveAt を使うのが昔風、Enumerable.Where を使うのが今風です。
miiiiiiiisuke

2020/04/28 02:53

除外ワードフィールド「ExclusionWord」をExcelとかでいうワイルドカード「*ExclusionWord*」という意味合いで放り込みたいのですが、可能でしょうか。
Zuishin

2020/04/28 03:03 編集

Directory.GetFiles にそのような除外機能はありません。List<T> にも ArrayList にもありません。gentaro さんのおっしゃるように正規表現を使うか、string の Contains メソッドを使うのが良いのではないかと思います。
miiiiiiiisuke

2020/04/28 03:05

ありがとうございます。「Enumerable.Where」をヒントに方法を探ってみます。 「正規表現」も今はなんのこっちゃですが、これを機に勉強します。
guest

回答3

0

方針だけ

  1. 配列filesという配列をリストに全部突っ込んでから削除するのではなく、filesの中で取り出したい要素だけを直接取り出せばいい。
  2. 取り出し方はLinqを使う。(whereで条件を指定する)
  3. 条件は正規表現で指定する。(正規表現の書き方はググりましょう)

という感じで頑張ってください。

投稿2020/04/28 02:46

編集2020/04/28 02:50
gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miiiiiiiisuke

2020/04/28 02:56

アドバイスありがとうございます! Linqやwhere、正規表現という言葉はまだ理解までいたっていません。 勉強します。
gentaro

2020/04/28 03:00

Linqは配列やリスト等のコレクションを扱う場合、正規表現は文字列操作をする場合にどちらも必修と言えるぐらい基本的な知識なので、コレを機に頑張って勉強してください。
guest

0

ベストアンサー

Linqを使用しないというのであれば、Removeするのではなく、条件にマッチしたもののみListにAddしていくという考え方もありかと思います。

C#

1// 指定フォルダパス以下全てのファイルパスを取得 2String[] files = System.IO.Directory.GetFiles( 3 txtFolderPath.Text, "*" , System.IO.SearchOption.AllDirectories); 4 5var filesToList = new List<string>(); 6foreach(var filename in files) 7{ 8 if(条件にマッチした) 9 { 10 filesToList.Add(filename); 11 } 12} 13// 結果をリストに表示 14lstFolderPathForSearchResult.Items.AddRange(filesToList.ToArray());

といった感じですかね

投稿2020/04/28 03:12

YAmaGNZ

総合スコア10489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miiiiiiiisuke

2020/04/28 03:55 編集

具体的なソースをありがとうございます!!大変助かります。 Linqは使用しないのではなく、恥ずかしながら使用できる技量がなく。。。 他の方にもアドバイスいただいたように、Linq、正規表現等勉強いたします。
miiiiiiiisuke

2020/04/28 06:55

foreach (var filename in files) { if (filename.Contains(ExclusionWord.Text) == false) { filesToList.Add(filename); } } 皆さんのアドバイスを組み合わせて、上記のように書いたところ上手くいきました! ありがとうございました!!
guest

0

リストから該当項目を削除するという場合、リストの後尾から先頭に向かって処理します。
先頭からやった場合、項目を削除した場合に以降の項目のインデックスが変わってしまうため、ややこしくなりますねー

投稿2020/04/28 02:45

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miiiiiiiisuke

2020/04/28 02:57

アドバイスありがとうございます!
y_waiwai

2020/04/28 02:59

まずは愚直に、普通のループで実装してみてはどうでしょうか
miiiiiiiisuke

2020/04/28 03:02

何が速い方法か分からないので色々試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問