2017-01-13 2 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.

Но это существует в моем проекте.

Как я могу получить имена всех файлов, используя этот счетчик?

UPDATE: При создании файла во время выполнения я использую HostingEnvironment.MapPath (@ "/ myproject /") + "/ App_Data". Это создает файл в местоположении. Но это не позволяет мне читать оттуда.

+0

Просто потому, что она присутствует в исходном дереве не означает, что он присутствует в вашей двоичной папке приложений, в которую скомпилирован ваш исполняемый файл. –

+2

Является ли значение 'AppDomain.CurrentDomain.BaseDirectory' именно тем, что вы думаете? – grek40

+0

Я думаю вместо 'AppDomain.CurrentDomain.BaseDirectory + " \\ App_Data \\ "' вы хотите 'Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData)' –

ответ

0

Если добавить с помощью System.IO или ссылку на него, это должно найти все XML-файлы в папке App_Data, в среде приложения:

 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 (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]

Поскольку ОП со ссылкой на веб-сценарии

Добавляя с помощью системы .Web.Hosting моему контроллеру, я смог протестировать «HostingEnvironment.MapPath» в приложении примера mvc. Вот что я придумал.

В этом примере находит виртуальный путь '/ 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: в View

<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

На самом деле AppDomain.CurrentDomain.BaseDirectory дает текущий рабочий каталог, в то время отладки он дает вам путь Your Projectfolder\\bin\\Debug\\.И вы хотите, чтобы найти App_Data папку внутри папки проекта, а не в debug Таким образом, вы должны вернуться в папку проекта, а затем найти App_Data как следующее:

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

Если это веб-приложение, используйте 'Server.MapPath' –

Смежные вопросы