我在运行时在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 :(得分: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
}
}