2017-01-13 3 views
0

実行時にApp_Dataフォルダ内に新しいファイルを作成しています。私の要件は、これらのファイル名を読み、さらに進んでいくことです。 私のコードは以下の通りである:上記のコード現在のプロジェクトフォルダにあるファイルの名前を取得します。

var filenames = from fullFilename 
       in Directory.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory + 
              "\\App_Data\\", "*.xml") 
       select Path.GetFileName(fullFilename); 

foreach (string filename in filenames) 
{ 
    System.Diagnostics.Debug.WriteLine("filename -- "+filename); 
} 

がディレクトリApp_Dataにを見つけることができないと言います。

これは私のプロジェクトにあります。

この列挙子を使用してすべてのファイルの名前を取得するにはどうすればよいですか?

更新日:実行時にファイルを作成するときに、私はHostingEnvironment.MapPath(@ "/ myproject /")+ "/ App_Data"を使用します。これにより、その場所にファイルが作成されます。しかしそれは私がそこから読むことを許さない。あなたが使用してSystem.IOまたはそれへの参照を追加する場合

+0

それはあなたのソースツリーに存在しているからといって:そして、あなたはあなたが戻ってプロジェクトフォルダに来るし、次のようなApp_Dataを見つける必要がありませんdebugでだから、プロジェクトフォルダ内App_Dataフォルダを検索したいです実行可能ファイルがコンパイルされるアプリケーションのバイナリフォルダに存在しているわけではありません。 –

+2

'AppDomain.CurrentDomain.BaseDirectory'の値はまさにそれがあなたのものだと思いますか? – grek40

+0

私は 'AppDomain.CurrentDomain.BaseDirectory + "の代わりに\\ App_Data \\ "'あなたがしたいと思う 'Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)' –

答えて

0

、これはあなたのアプリケーション環境でApp_Dataフォルダ内のすべての.xmlファイルを、見つける必要があります。

 DirectoryInfo di = new DirectoryInfo(Server.MapPath("/App_Data")); 
     var fi = di.EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly); 

// fi should contain the enumeration of files found at that path 
// you can iterate over fi and have all the file info of each file found 

[UPDATE]

すでにパス文字列が解決されている場合は、Server.MapPath( "/ App_Data")全体をデスクトップアプリケーションのパスに置き換えることができ、残りは同じままです。ちょうどのようにforeachループを使用してコレクションにわたって反復する

  foreach (FileInfo file in fi) 
      { 
       string s = "File Name: " + file.Name + "\r"; 
       s += "Full Path: " + file.FullName + "\r"; 
       s += "File Ext.: " + file.Extension + "\r"; 
       MessageBox.Show(s); 
      } 

[UPDATE 2]

OPを使用してシステムを追加することにより、ウェブシナリオ

に言及されているので私のコントローラへの.Web.Hosting文私はmvcサンプルアプリケーションで 'HostingEnvironment.MapPath'をテストすることができました。 ここに私が思いついたのがあります。

この例では、仮想パス '/ App_Data'を探し、パスで見つかった '.xml'ファイルを収集します。 次に、コレクションを反復処理し、各ファイルの内容を配列要素に読み込みます。 最後に、ファイル名を見出しにリンクとして表示し、各ファイルの内容に見出し#を付けて表示します。 これは、最適化されたコードサンプルではない可能性があることに注意してください。

C#コード:MVCコントローラで

 DirectoryInfo di = new DirectoryInfo(HostingEnvironment.MapPath("/App_Data")); 
     var fi = di.EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly); 
     ViewBag.Files = fi; 
     string[] fs = new string[fi.Count()]; 
     int fc = fi.Count(); 
     int x = 0; 
     foreach (FileInfo f in fi) 
     { 
      StreamReader sr = new StreamReader(f.FullName); 
      fs[x] = sr.ReadToEnd(); 
      sr.Close(); 
      if (x < fc) x++; 
     } 
     ViewBag.Contents = fs; 
     ViewBag.ContCount = fc; 

HTML:ビュー

<div> 
    <h3>Files Found:</h3> 
    <p> 
     @foreach (FileInfo f in @ViewBag.Files) 
     { 
      <a href="@f.FullName">@f.Name</a><br /> 
     } 

    </p> 

</div> 
<div> 
    <h3>File Contents:</h3> 
    @for (int c = 0; c < @ViewBag.ContCount; c++) 
    { 
     <h4>Heading @(c)</h4> 
     <p> 
      @ViewBag.Contents[@c] 
     </p> 
     <hr /> 
    } 
</div> 
0

で、それはあなたのパスYour Projectfolder\\bin\\Debug\\を与えてデバッグしている間、実際AppDomain.CurrentDomain.BaseDirectoryは、あなたの現在の作業ディレクトリを提供します。

string projectFolder = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.FullName; 
string folderAppData = Path.Combine(projectFolder, "App_Data"); 
if (Directory.Exists(folderAppData)) 
{ 
    foreach (string file in Directory.EnumerateFiles(folderAppData,"*.xml")) 
    { 
      // Do your stuff here 
    } 
} 
+0

ありがとうございます。しかし問題は、そのフォルダ内のファイルを反復することです。 HostingEnvironment.MapPath(@ "/ myproject /")+ "/ App_Data"でパスを見つけることができます。すでに最初の手順としてそのフォルダ内にファイルを作成しています。ファイルを読み取っているときに例外 "C:\ Users \ User1 \ Workspace \ Myproject \ App_Dataのパスを見つけることができません" – Neha

+0

Webアプリケーションの場合は、 'Server.MapPath' –

関連する問題