Streamreader读取同一目录中的文件

时间:2018-09-17 09:17:20

标签: c#

我想读取一个CSV文件,该文件与我的代码位于同一目录。

files

我想阅读.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文件的路径。

路径有什么问题?

4 个答案:

答案 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");