读取文件失败,路径中的非法字符?

时间:2014-03-19 02:09:24

标签: c#

我正在尝试使用File.ReadAllLines()从资源文本文件(单词)中读取。但每次运行时我都会在路径中收到错误消息非法字符。有什么想法吗?

//Get all of the words from the text file in the resources folder
string[] AllWords = File.ReadAllLines(Conundrum.Properties.Resources.Words);

4 个答案:

答案 0 :(得分:2)

如果它实际上作为资源添加到项目中,请尝试直接引用它:

var allWords = Conundrum.Properties.Resources.Words;

如果你想在一个数组中,拆分换行符:

var allWords = Conundrum.Properties.Resources.Words
                 .Split(new[] { Environment.NewLine }, StringSplitOptions.None);

我只是试了一下,这对我有用。使用File.ReadAllLines抛出相同的异常......我认为它实际上需要一个完整的文件路径,通向磁盘上的文件。

答案 1 :(得分:0)

如果不知道您尝试传入的路径的值,就很难对此进行诊断。但是,请查看C#函数Path.GetInvalidFileNameChars()Path.GetInvalidPathChars()。有了这些,你应该很容易弄清楚你的道路有什么问题!

var path = Conundrum.Properties.Resources.Words;
var invalidPathChars = path.Where(Path.GetInvalidPathChars().Contains).ToArray();
if (invalidPathChars.Length > 0)
{
    Console.WriteLine("invalid path chars: " + string.Join(string.Empty, invalidPathChars));
}

var fileName = Path.GetFileName(path);
var invalidFileNameChars = fileName .Where(Path.GetInvalidFileNameChars().Contains).ToArray();
if (invalidFileNameChars .Length > 0)
{
    Console.WriteLine("invalid file name chars: " + string.Join(string.Empty, invalidFileNameChars ));
}

对于资源文件,并不是通常将这些文件编译到程序集中,因此可能无法以原始形式在磁盘上使用。您可以使用内置属性或使用Assembly.GetManifestResourceStream()来检索它们。

答案 2 :(得分:0)

我尝试了一些事情,这似乎是最好的。

string resource_data = Properties.Resources.Words;
string[] AllWords = resource_data.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

答案 3 :(得分:0)

我知道这是一个老问题,但当我潜伏在这个确切主题的这些部分时......这是我的看法:

据我所知,资源文本文件被视为文本文件,希望 File.ReadAllLines(Conundrum.Properties.Resources.Words) 将 .txt 文件中的行读取为字符串。 >

但是,通过以这种方式使用 ReadAllLines(),它会立即将第一行读取为文件路径名,因此会出现错误消息。

我建议按照 this answer from @Contango 将文件添加为资源。

然后,按照this answer from @dtb,稍加修改,您将能够读取文本文件内容:

        using System.Reflection; //Needs this namespace for StreamReader
        
        var assembly = Assembly.GetExecutingAssembly();
        
        //Ensure you include additional folder information before filename
        var resourceName = "Namespace.FolderName.txtfile.txt"; 

        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        using (StreamReader sr = new StreamReader(stream))
        {
            string line;

            while ((line = sr.ReadLine()) != null)
            {
                //As an example, I'm using a CSV textfile
                //So want to split my strings using commas
                string[] fields = line.Split(',');                  
                
                string item = fields[0];
                string item1 = fields[1];
            }
            sr.Close();
        }