从头开始:
我在Visual Studio中创建了一个Windows窗体应用程序
我创建了一个名为" dataFolder"的文件夹。通过向项目中添加新文件夹
我在文件夹中添加了一个新的csv文件" dataFile.csv"
我想使用StreamReader来读取该文件,但我不知道如何使用它。
现在我的问题是:如何在我刚创建的文件夹中访问该文件?
项目文件夹中文件夹的文件路径是: " C:\ Users \ user \ Documents \ Visual Studio 2012 \ Projects \ AppName \ AppName \ dataFolder"
我已设置要在发布时复制的文件。
当我发布应用程序并安装它时,该文件夹的路径会发生变化(显然)。应用程序路径类似于: " C:\ Users \ user \ AppData \ Local \ Apps \ 2.0 \ X8NNA ......."以及更多数字和字母。
如何访问该csv文件?
谢谢。
编辑1:基于回复
我这样做:
string fileData = CSVApplication.Properties.Resources.dataFile;
string[] lines = fileData.Split(Environment.NewLine.ToCharArray());
foreach (string line in lines)
{
MessageBox.Show(line);
}
即使我的csv文件中只有3行,上面的代码也给了我5个消息框。 第一个带有标题行的消息框,第二个空白,第三个消息框显示csv文件的第二行,第四个消息框为空,最后一个消息框显示我的csv文件中的最后一行。 / p>
我不明白为什么我会得到这些空白。
如果我可以摆脱它们,那么我想我必须拆分行,以便我可以在数据集中加载数据。
答案 0 :(得分:1)
如果文件始终相同,您可以将其创建为资源:
右键单击该项目,转到参考资料。从顶部选择添加资源,添加现有文件。导航到它。然后,您可以使用代码访问该文件:
string fileData = MyNamespace.Properties.Resources.csvFile
String[] lines = fileData.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToArray();
另一种方法是使用Environment.CurrentDirectory
,它将为您提供可执行文件所在的文件夹。然后您可以从中找出文件夹的路径并相应地修改它。
例如,假设我想在运行时从我的资源文件夹中读取文件以获取名为Thing.csv的文件我可以这样做:
string path = Environment.CurrentDirectory;
string[] parts = path.Split(@"\".ToCharArray());
var list = parts.TakeWhile(x=>x != "bin").ToList();
list.Add("Resources");
list.Add("Thing.csv");
var pathStr = string.Join(@"/", list.ToArray());
以上工作假设名为Resources的文件夹与典型的winforms应用程序中的bin文件夹存在于同一文件夹中。如果通过发布进行部署,那么逻辑就会崩溃。
<强>更新强> 如果您希望存在作为部署的一部分存在的文件夹,则可以向解决方案添加deployment project并在其中创建文件夹。否则,需要在部署后手动创建该文件夹。还有免费安装程序,您可以下载this
一旦知道文件夹相对于可执行文件的位置,就可以在运行时删除文件 - 读取Environment.CurrentDirectory,以可预测的方式修改路径,这很可能是从CurrentDirectory路径字符串中删除任何额外的文件夹。然后将文件夹+ filename附加到路径,然后使用StreamReader。
最终,你如何做到这一点取决于你的app逻辑当然:)你可以选择从配置文件中读取文件夹的路径,你可以在部署后编辑,或者你可以在表单应用程序中添加一个函数设置一个目录以查看并保留信息。很多选择。
答案 1 :(得分:1)
希望这有助于..您可能需要一些性能优化
public List<string> Read ( String csvFilePath )
{
var list = new List<string>();
using (var stream = new FileStream( csvFilePath, FileMode.Open))
{
var reader = new StreamReader( stream);
stream.Seek(0, SeekOrigin.Begin);
list.AddRange(reader.ReadToEnd().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList());
}
return list;
}
用法示例:
// With this path assigning you' ll get your executable's root directory
var Path = AppDomain.CurrentDomain.BaseDirectory + "\YourFolder";
var csvList = Read(Path);