2016-03-03 192 views
1

我正在创建一个小型的宠物加密项目,并正在从文本文件中读取文本,在每行在数组中时对其进行修改,然后将其提交回其文本文件。问题在于将字符串添加回文件,因为文本文件的当前文本就像现在的程序一样简单地被删除。更具体地说,我想把数组中的所有字符串都放到一个单独的字符串中,这就是我相信错误的地方。这是我写的代码。加密:将字符串数组转换为单个字符串

static void Main(string[] args) 
    { 
     string[] getAllText = File.ReadAllLines("H:\\BetaText.txt"); 

     File.WriteAllText("H:\\BetaText.txt", string.Concat(Lock(getAllText))); 
     System.Diagnostics.Process.Start("H:\\BetaText.txt"); 
    } 

锁只是我的程序中的一个方法,它返回一个加密的字符串数组。文本文件被确认被正确解析并且修改返回的确确实返回了我想要的数组。问题仍然是我的string.Concat()语句。我知道如何用多行语句解决这个问题,但是我想避免这种情况,并了解为什么Concat()语句不按我想的方式工作。我也使用了带“”分隔符的string.Join方法。通过StackOverflow查看我还没有看到这个答案,根据MSDN文档,我不认为我应该有这个问题。谢谢。

+0

您发布的代码是否仅将单个项目放入字符串[]中?看起来你需要在'File.ReadAllLines'的字符串结果中的某个分隔符上执行一个'Split()'方法来获取字符串[]中的多个项目。连接单个字符串[]项只会返回一个字符串。 – Russ

+1

当你可以将整个文件读入一个字节[]时,是否有加密数组中的每个字符串的特殊原因,进行加密,然后写回加密的字节? – series0ne

+1

那么'string.Concat'返回什么,你期望它返回什么? –

回答

2

您可以使用String.Join将字符串数组连接成单个字符串。你

String.Join ("", getAllText); 

也可以使用Aggregate

getAllText.Aggregate((c, n) => string.Format("{0}{1}", c, n); 

使用聚合可以构建更复杂的例子。例如,您可以如何使用逗号分隔它们。

getAllText.Aggregate((c, n) => string.Format("{0}, {1}", c, n)); 
+0

我以前没有见过这种方法,也不知道如何使用它。你能举一个例子说明'f'和'n'是什么吗?我检查了MSDN,但我不完全明白。 –

+0

我把'f'改成'n'。我明白它是'c'-current set和'n' - next元素。试试这个链接http://stackoverflow.com/questions/7105505/linq-aggregate-algorithm-explained – Valentin

+0

我看到绝对没有理由为什么当我们有'string.Join'和'string.Concat'时应该使用'Aggregate' '。 –

1

或者只是用','加入。选择另一个分隔符,如果你想

var writeText = string.Join(", ", Lock(getAllText).Select(v => v.ToString())); 
File.WriteAllText("H:\\BetaText.txt", writeText); 
+0

也在尝试描述。输出是一样的。一个空的文本文件。 –

+0

尝试更新后的答案,并检查看看writeText是否为空? –

1

那么你正在做的是阅读文件,行由行成一个string[],然后加密每行,然后提交这些行返回到一个文件中。

就个人而言,我觉得你的做法是错误的(直觉,但这里的原因)

File.ReadAllLines通过使用换行符(Environment.NewLine"\r\n""\n" ...)拆分文件创建一个数组 - 会发生什么如果您的加密算法恰好将某些特定字节加密为换行符? - 突然你的换行符是不同的 - 因此做反向将基本上失败(我想,既然解密文件“可能”与不同的换行符工作)

一个更好的解决办法是这样的:

byte[] unencryptedBytes = Encoding.UTF8.GetBytes(File.ReadAllText(filename)); 
byte[] encryptedBytes = Lock(unencryptedBytes); 
File.WriteAllText(filename, Encoding.UTF8.GetString(encryptedBytes)); 

我知道这是不是技术上有什么你所要求的(对不起) - 我只是有这种感觉:你在做什么,可能无法正常工作。