我正在尝试使用File.ReadAllLines()
从资源文本文件(单词)中读取。但每次运行时我都会在路径中收到错误消息非法字符。有什么想法吗?
//Get all of the words from the text file in the resources folder
string[] AllWords = File.ReadAllLines(Conundrum.Properties.Resources.Words);
答案 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();
}