Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在区分大小写的路径中读/写_C#_Json - Fatal编程技术网

C#在区分大小写的路径中读/写

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上

我有个问题

我将json从web保存在计算机上的json文件中,该json文件的名称是json的web地址。 为此,我将web json转换成字符串,然后用
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=