2017-01-13 3 views
0

Ich erstelle neue Dateien zur Laufzeit im Ordner App_Data. Meine Anforderung besteht darin, diese Dateinamen zu lesen und fortzufahren. Mein Code ist wie folgt:Name der Dateien im aktuellen Projektordner

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); 
} 

Above Code sagt

nicht das Verzeichnis App_Data finden.

Aber das existiert in meinem Projekt.

Wie kann ich Namen aller Dateien mit diesem Enumerator bekommen?

UPDATE: Beim Erstellen der Datei zur Laufzeit verwende ich HostingEnvironment.MapPath (@ "/ myproject /") + "/ App_Data". Dadurch wird eine Datei am Speicherort erstellt. Aber es erlaubt mir nicht, von dort zu lesen.

+0

Nur weil es in Ihrem Quellbaum ist bedeutet nicht, dass es in Ihrem binären Anwendungsordner vorhanden ist, in den Ihre ausführbare Datei kompiliert wird. –

+2

Ist der Wert von 'AppDomain.CurrentDomain.BaseDirectory' genau das, was Sie denken? – grek40

+0

Ich denke anstelle von 'AppDomain.CurrentDomain.BaseDirectory + " \\ App_Data \\ "' Sie wollen 'Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData)' –

Antwort

0

Wenn Sie eine using System.IO oder einen Verweis darauf hinzuzufügen, sollte dies alle XML-Dateien im Ordner App_Data, in Ihrer Anwendungsumgebung finden:

 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]

Wenn Sie die Pfadzeichenfolge bereits aufgelöst haben, können Sie den gesamten Server.MapPath ("/ App_Data") durch den Pfad für eine Desktopanwendung ersetzen, und der Rest bleibt unverändert.

über die Sammlung iterieren nur eine foreach-Schleife verwenden, wie in:

  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]

Da die OP zu einem Web-Szenario bezieht sich

Durch die Verwendung von System-Zugabe .Web.Hosting-Anweisung an meinen Controller Ich konnte das 'HostingEnvironment.MapPath' in einer mvc-Beispielanwendung testen. Hier ist, was ich gefunden habe.

In diesem Beispiel wird der virtuelle Pfad '/ App_Data' gefunden, sammelt die '.xml' Dateien, die im Pfad gefunden werden. Dann iteriert es über die Sammlung und liest den Inhalt jeder Datei in ein Array-Element. Schließlich zeigt es die Dateinamen als Links in der Ansicht sowie den Inhalt jeder Datei mit einer Überschrift # an. Beachten Sie, dass dies möglicherweise nicht das am besten optimierte Codebeispiel ist.

C# Code: in Mvc-Controller

 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: in Ansicht

<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

Tatsächlich ist die AppDomain.CurrentDomain.BaseDirectory gibt Ihnen das aktuelle Arbeitsverzeichnis, beim Debuggen es Ihnen den Weg gibt Your Projectfolder\\bin\\Debug\\.Und Sie wollten den App_Data Ordner innerhalb des Projektordner finden, nicht in debug So müssen Sie in den Projektordner zurückkommen und dann finden die App_Data wie folgt aus:

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

Danke. Das Problem besteht darin, Dateien innerhalb dieses Ordners zu iterieren. Ich kann den Pfad mit HostingEnvironment.MapPath (@ "/ myproject /") + "/ App_Data" finden, da ich bereits Dateien in diesem Ordner als ersten Schritt erstelle. Beim Lesen von Dateien wird die Ausnahme "Teil des Pfades nicht gefunden C: \ Users \ User1 \ Workspace \ Myproject \ App_Data" gefunden. – Neha

+0

Wenn es sich um eine Webanwendung handelt, verwenden Sie 'Server.MapPath' –

Verwandte Themen