我想读取一个CSV
文件,该文件与我的代码位于同一目录。
我想阅读.csv
public static void InitializeItems()
{
itemList = new Dictionary<int, Item>();
string filePath = Path.Combine(Directory.GetCurrentDirectory(), "\\Items.csv");
using (StreamReader reader = new StreamReader(filePath))
{
int lineCounter = 0; // Do I really need such a counter for the current line?
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
string[] values = line.Split(',');
string name = values[0];
itemList.Add(lineCounter, new Item(name));
lineCounter++;
}
}
}
private static Dictionary<int, Item> itemList;
这样做可以得到一个System.IO.FileNotFoundException
异常。文件C:\Items.csv
不存在。
Directory.GetCurrentDirectory()
向我返回.exe
文件的路径。
路径有什么问题?
答案 0 :(得分:1)
获取.exe文件路径的方法如下:
AppDomain.CurrentDomain.BaseDirectory
然后,您必须将BuildAction
设置为Content
。这样,文件将在构建后复制到文件夹exe。
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "file.csv");
答案 1 :(得分:1)
当前目录不是必需的 执行exe的目录:
// Current directory can be whatever you want:
Environment.CurrentDirectory = @"c:\SomeDirectory";
如果您正在寻找 exe 路径,可以尝试
string exePath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
在您的情况下:
using System.Reflection;
...
string filePath = Path.Combine(
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location),
"Items.csv");
编辑:您可以借助 Linq 来简化代码(摆脱StreamReader
):
var itemList = File
.ReadLines(filePath)
.Select((line, index) => new {
value = new Item(line.SubString(0, line.IndexOf(',') + 1)),
index = index
})
.ToDictionary(item => item.index, item => item.value);
答案 2 :(得分:0)
要回答您的直接问题,what is wrong
:使用Path.Combine
时,文件不能以反斜杠开头。您应该这样写:
string filePath = Path.Combine(Directory.GetCurrentDirectory(), "Items.csv");
修改: 默认情况下,“ CurrentDirectory”指向您的exe文件,除非您在代码或快捷方式中对其进行了更改。
答案 3 :(得分:0)
首先,建议在项目中创建一个新文件夹来存储文件并将其命名为MyFiles
,
然后假设您的文件是csv
文件,名为test.csv
因此可以这样访问:
string testFilePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"MyFiles\test.csv");