none
フォルダ内取得について教えて下さい。 RRS feed

  • 質問

  • 質問です。
    「あるフォルダ以下にあるファイルをすべて取得する」で、

    Dim files As New ArrayList
    '"C:\My Documents"以下のファイルをすべて取得
    GetAllFiles("C:\My Documents", "*.*", files)
    'ListBox1に結果を表示する
    ListBox1.Items.AddRange(files.ToArray())

    でフォルダ内を取得する方法は分かっていますが、
    この取得したファイル以外で特定のファイル以外を
    削除する事は出来ますでしょうか?
    例えば

    Test1.txt←必要
    Test2.txt←不要
    Test3.txt←必要

    でファイル取得した時に
    ("Test1.txt")と("Test3.txt")だけ残して
    他は削除したいのです。
    必ずしも"test2.txt"という名前ではありません。

    この行動を文法(ソース)を書きたいのですが、
    分かりません。
    どなたか教えてください。
    2009年7月4日 2:29

回答

  • GetAllFilesで取得したファイルを一つずつ条件に適合しているかをチェックし、適合していればListBoxに追加するのが一番汎用的でしょう。適合しているかどうかは正規表現(Regexクラス)を用いれば簡単にできます。ListBoxへの追加はListBox.Items.Addメソッドで可能です。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク Politur 2009年7月5日 11:01
    2009年7月4日 13:20
    モデレータ
  • 正規表現は比較するための一つの手段です。用途にもよりますが、無理に使う必要はありません。
    例えば、「残しておきたいファイル名の配列」というものが別途あるのであれば、文字列(string)のEqualsメソッドでも比較できます。

    イメージコードとしては下記のような感じでしょうか。
    比較する際はファイル名は大文字小文字を区別しない点と、パスを取り除いておくことが必要な点は気にして下さい。

    テストする際は、ファイルを消す代わりにテスト用のListBoxにAddして、問題なく抽出できているか確かめるべきでしょう。

    string[] フォルダにあるファイルの配列;
    string[] 残しておきたいファイルの配列;

    foreach (string フォルダにあるファイルの1つ in フォルダにあるファイルの配列)
    {
      bool 消すの? =  true;
      foreach (string 残しておきたいファイルの1つ in 残しておきたいファイルの配列)
      {
        if ( 残しておきたいファイルの1つとフォルダにあるファイルの1つは同じか?)
        {
           消すの? = false;
           break;
        }
      }
      if (消すの?)
      {
        ファイルを消す。
      }
    }


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク Politur 2009年7月5日 11:01
    2009年7月4日 23:18
    モデレータ

すべての返信

  • GetAllFilesで取得したファイルを一つずつ条件に適合しているかをチェックし、適合していればListBoxに追加するのが一番汎用的でしょう。適合しているかどうかは正規表現(Regexクラス)を用いれば簡単にできます。ListBoxへの追加はListBox.Items.Addメソッドで可能です。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク Politur 2009年7月5日 11:01
    2009年7月4日 13:20
    モデレータ
  • trapemiya さん

    回答有難うございます。
    ちょっと「Regexクラス」が理解出来ません。
    初心者であるせいか・・・。
    一番ソースコードで書いて頂けると理解出来るのですが、可能でしょうか?
    少し頭がごちゃごちゃになって理解が出来ず申し訳ありません。

    ぜひ、お願いします。
    2009年7月4日 18:07
  • 正規表現は比較するための一つの手段です。用途にもよりますが、無理に使う必要はありません。
    例えば、「残しておきたいファイル名の配列」というものが別途あるのであれば、文字列(string)のEqualsメソッドでも比較できます。

    イメージコードとしては下記のような感じでしょうか。
    比較する際はファイル名は大文字小文字を区別しない点と、パスを取り除いておくことが必要な点は気にして下さい。

    テストする際は、ファイルを消す代わりにテスト用のListBoxにAddして、問題なく抽出できているか確かめるべきでしょう。

    string[] フォルダにあるファイルの配列;
    string[] 残しておきたいファイルの配列;

    foreach (string フォルダにあるファイルの1つ in フォルダにあるファイルの配列)
    {
      bool 消すの? =  true;
      foreach (string 残しておきたいファイルの1つ in 残しておきたいファイルの配列)
      {
        if ( 残しておきたいファイルの1つとフォルダにあるファイルの1つは同じか?)
        {
           消すの? = false;
           break;
        }
      }
      if (消すの?)
      {
        ファイルを消す。
      }
    }


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク Politur 2009年7月5日 11:01
    2009年7月4日 23:18
    モデレータ
  • ありがとうございます。
    解決しました。
    2009年7月5日 11:01