2016-03-03 191 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)); 

我知道這是不是技術上有什麼你所要求的(對不起) - 我只是有這種感覺:你在做什麼,可能無法正常工作。