C#在区分大小写的路径中读/写
我有个问题 我将json从web保存在计算机上的json文件中,该json文件的名称是json的web地址。 为此,我将web json转换成字符串,然后用C#在区分大小写的路径中读/写,c#,json,C#,Json,我有个问题 我将json从web保存在计算机上的json文件中,该json文件的名称是json的web地址。 为此,我将web json转换成字符串,然后用file.AppendAllText(路径、内容) 一段时间后,我还需要使用file.ReadAllText(path) 我的问题是,有时两个json的名称非常相似,例如: *com/doc/BACr和 *com/doc/BAcr 问题是,类文件的方法中给出的路径是区分大小写的,因此我在同一个文件中写了两次,并破坏了它 我在internet上
file.AppendAllText(路径、内容)
一段时间后,我还需要使用file.ReadAllText(path)
我的问题是,有时两个json的名称非常相似,例如:
*com/doc/BACr和
*com/doc/BAcr
问题是,类文件的方法中给出的路径是区分大小写的,因此我在同一个文件中写了两次,并破坏了它
我在internet上找到了方法File.Exists(path)
的相同问题的解决方案,但没有任何方法可以替代我用于读取或写入的方法
你们中有人知道一个设置,或者甚至是另一个在路径上区分大小写的方法吗
多谢各位
编辑:我显然在windows上工作:(
编辑bis:我不能更改文件名,因为在其他一些json中,有对web路径的引用,当我再次播放我的本地json时,如果文件名被修改,它将找不到。这就是我需要使用区分大小写的路径进行写和读的原因。Windows路径确实不区分大小写,因此不能使用这些文件名 一个解决方案是更改文件名(如果它已经存在的话)。。。 比如,
if (File.Exists(fileNameToSaveTo)){
// Note: Your example file names did not have an extension,
// but if they do, you will need to first extract that then add it back on
fileNameToSaveTo = fileNameToSaveTo + "1";
}
如果使用此解决方案,您还必须更新您的程序在以后从文件中读回的任何标识符…因为您没有发布任何代码,我无法猜测这将采取什么形式,但希望您能理解
编辑:
在重新阅读您的问题后…您似乎使用了AppendAllText…在这种情况下,这不应该像您建议的那样“损坏”文件,而应该简单地将内容添加到文件的末尾?这不是您观察到的吗
编辑2:
读取Iomed注释后-在写入文件之前,可以在写入文件时对文件名使用Convert.ToBase64String,在读取文件之前,在读取函数中对文件名使用Convert.FromBase64String。这将允许文件名根据大小写不同
另一种选择是解析JSON(新文件和现有文件)并将对象添加到数组中,然后将其写入文件中,以避免“损坏”问题?您需要使文件具有唯一性的东西,同时,当您想读回这些文件时,还需要能够重建这种唯一性的东西 假设您的两个文件名为“BAcr”和“BAcr”,您可以得到这两个字符串的哈希代码,您将得到两个不同的值
string file1 = "BAcr";
int file1Hash = file1.GetHashCode(); //742971449
string file2 = "BACr";
int file1Hash = file2.GetHashCode(); //-681949991
现在,如果您将此哈希代码连接到文件名,您将得到两个不同的文件,并且您将能够为相同的输入文件名重新计算相同的哈希代码
string newFile1 = $"{file1}.{file1Hash}";
string newFile2 = $"{file2}.{file2Hash}";
您将在这两个重新计算的文件名中保存数据,当您需要重新加载它们时,您将使用相同的技巧从相同的输入“BAcr”或“BAcr”获取用于保存数据的文件名
但在其结果中,仍然使用相同的总体思路使用此方法从输入值中获取唯一的代码
string unique1 = string.Join("", file1.Select(c => char.IsUpper(c) ? "1" : "0"))
string newFileName1 = $"{file1}.{unique1}";
给定路径:
PathA
,PathA
对于两个文件,请使用base64技巧:
string PathToFile(string url) => System.Convert.ToBase64String(Encoding.UTF8.GetBytes(url));
因此:
问题是windows的路径不区分大小写。以某种方式对文件名进行编码是否可行?是否要求以后能够使用URL检索文件?如果文件名存在,请尝试向其添加时间戳。windows实际上可以处理区分大小写的文件系统(NTFS保留大小写),但它不是Win32子系统上运行的任何代码的默认值,从C#访问此代码绝非易事。解决此问题更为实际。例如,您可以将文件的ASCII字符转换为十六进制字符串,并将其用作名称,在转换回文件时保留大小写。您可以将路径转换为base64.so对于大小写不同的相同字符串也是唯一的yes,但是对于Json,当我在第一个字符串末尾添加我的Json时,它会损坏,因为文件包含2个Json对象,而不是一个:(您可以解析Json(新的和现有的文件)并将对象添加到数组中,然后将其写入文件?@ThibaultJouan请参阅我的Edit2以获得两种解决方案。如果知道哈希代码不是唯一的,为什么要使用哈希代码?我没有调查
String.GetHashCode
,以查看是否可能对单独大小写不同的字符串产生任何冲突,但我真的不想依赖它首先,这只需要一次冲突。除非文件名异常长,否则我更喜欢它们的Base64编码版本。作为奖励,这可以对文件系统无法处理的所有内容进行编码,包括禁止的字符,以及它的往返,而散列不会。是的,可能你是对的。在lin中重新阅读答案k从E.Lippert发帖到上面,现在我对这个解决方案也有同样的疑问。如果你坚持保持可读的文件名,并且只担心大小写,那么String.Join(“,”abcABC“。Select(c=>char.IsUpper(c)?“1”:“0”))
将以往返的方式显式记录每个字符的大小写。abcABC.000111
将成为修改后的名称。@Jeroenmoster这样更好,请尽快发布您的答案,我会删除我的。@Steve:请随意窃取我的想法,它首先是基于您的。:-)考虑到他们的额外评论,我不确定这是否有助于OP的开始。
Console.WriteLine(PathToFile("pathA")); //cGF0aEE=
Console.WriteLine(PathToFile("patha")); //cGF0aGE=