2012-03-19 11 views
0

私は、ディレクトリの場所を横断し、そこからデータモデルを作成するコードスニペットを持っています。私は、ディレクトリ構造がある場合たとえば、:イミディエイトウィンドウで値が表示されないのはなぜですか?

c:\TestDir1 

c:\TestDir1\Sub1\ 
c:\TestDir1\Sub1\File1.txt 
c:\TestDir1\Sub1\File2.txt 

c:\TestDir1\Sub1\SubSub1 
c:\TestDir1\Sub1\SubSub1\File3.xlsx 

c:\TestDir1\Sub1\SubSub1\SubDirX 
c:\TestDir1\Sub1\SubSub1\SubDirX\File4.txt 
c:\TestDir1\Sub1\SubSub1\SubDirX\File5.txt 
c:\TestDir1\Sub1\SubSub1\SubDirX\File6.txt 

をこれは、次のコードを介して適切なデータモデルを作成します。

static void BeginIt() 
{ 
    DirectoryInfo diTop = new DirectoryInfo(@"c:\Misc\3) Projects\002) Document Manager\DirectoryReading\TestDir1"); 
    string path = diTop.FullName; 
    MySubDir mySubDir = new MySubDir(path); 
} 

public class MySubDir 
{ 
    public ArrayList _dirs; 
    public ArrayList _files; 

    public MySubDir(string dirPath) 
    { 
     _dirs = new ArrayList(); 
     _files = new ArrayList(); 
     this.ProcessDirectory(dirPath); 
    } 

    private void ProcessDirectory(string dirPath) 
    { 
     // Process the list of files found in the directory. 
     string[] fileEntries = Directory.GetFiles(dirPath); 
     foreach (string fileName in fileEntries) 
     { 
      _files.Add(fileName); 
     } 

     // Recurse into subdirectories of this directory. 
     string[] subdirectoryEntries = Directory.GetDirectories(dirPath); 

     foreach (string subdirectory in subdirectoryEntries) 
     { 
      _dirs.Add(new MySubDir(subdirectory)); 
     } 
    } 
} 

はここに私の質問です。コードを1行ずつ進めると、データモデルが適切に構築されます。 AddWatchを実行すると、オブジェクトが表示され、ディレクトリ構造が適切に構築されます。

イミディエイトウィンドウからコンテンツの値にアクセスしようとすると、エラーが発生します。たとえば、イミディエイトウィンドウに次のように入力すると、次のようになります。

? mySubDir._dirs [0] ._ dirs [0]

私はエラーが発生します。

これらのサブディレクトリの値はどうやって取得できますか?私は、このモデルの要素のディレクトリ名とファイル名にアクセスできるようにしたいと考えています。それがうまくいくように表現mySubDir.whatevermySubDirがスコープ内にあることと、有効な値を持つに依存するので、見ていない

おかげ

+1

エラーが発生した場合は、非常に注意深く読んでみてください。問題の手がかりを含んでいる可能性があります。b)質問で言及する場合は、実際のエラー情報を含める*そこから有益な情報を集めることはできません。 –

+0

さらに、直近のウィンドウにアクセスすることに言及する場合は、どこで*実行を停止したかを指定することもできます(たとえば、ソースに '< - Breakpoint here'などのようにコメントを追加するなど) –

答えて

1

。そのためにコンストラクタはを最初に返します。 - コンストラクタの実行時にの間にオブジェクトには、が設定されています。このような表現が意味のある結果をもたらすことは、このプログラムの存続期間中は実際には意味がありません。

ProcessDirectoryメソッド内のデバッガに侵入した場合は、this._dirsを使用してデータ構造を調べることができます。

それ以外では、ArrayListは、あなたが持っているコレクションのように、あらかじめstringが含まれていることがわかっているコレクションには最適ではありません。それらをSystem.Collections.Generic.List<string>と定義する方が適切です。

0

うーん._dirsとファイルはarraylistです。そのリストを横断してすべての値を取得したいかもしれません。列挙子、LINQまたは任意の方法であなたが好きなトリックを行います。..

更新、ため:いくつかのより多くのあなたの記事を読んだ後

、私は基本的な理解の問題があると思います。クラスに名前だけを追加しても、ファイルの位置やフォルダは表示されません。

0

_dirsはオブジェクトを格納するArrayListなので、最初の_dirからオブジェクトをキャストする必要があります(つまり、フォルダを保持できるファイル)。 [0]からMySubDirへ

((MySubDir)mySubDir._dir[0])._dir[0] 

こと、またはインデクサでアクセスする場合、これはあなたを強く型付けされたリスト項目を与える

List<MySubDir> 

へのArrayListからコレクション型を変更します。

関連する問題