获取当前项目文件夹中存在的文件的名称

时间:2017-01-13 06:50:49

标签: c#

我在运行时在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”。这将在该位置创建文件。但它不允许我从那里读。

2 个答案:

答案 0 :(得分:0)

如果添加使用System.IO或对其的引用,则应在应用程序环境中找到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);
            }

[更新2]

由于OP指的是Web场景

通过将使用System.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>

答案 1 :(得分:0)

实际上AppDomain.CurrentDomain.BaseDirectory为您提供了当前的工作目录,在调试时它为您提供了路径Your Projectfolder\\bin\\Debug\\。并且您希望在Project文件夹中找到App_Data文件夹,而不是debug,因此您必须返回Project文件夹,然后找到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
    }
}