2017-05-03 27 views
0

沒有人知道C#等於powershells「get-content -Encoding Byte」嗎?C#:get-content -Encoding來自Powershell的字節

我想這transorm:

Get-Content $m1,$m2,$m3 -Enc Byte -Read 512 | Set-Content $m4 -Enc Byte 

到C#代碼,而無需調用PowerShell進程。

+1

在目前的形式下,你的問題只能由知道* Powershell和C#的人來解答,或者願意對他們進行研究。如果你可以描述你想要達到的目標 - 「Get-Content」做了什麼,「-Enc Byte」參數意味着什麼 - 它會更容易幫助你。 (什麼是'm1','m2'和'm3'?) –

+0

Hey Jon,它以二進制方式連接文件,這些$ m是路徑字符串。在我的情況下,我想打包一些文件進行7zip無提示安裝。謝謝你的評論。 –

+0

等效的命令行將是複製/ b「%〜dp0 \ 7zip \ 7zSd.sfx」+「%〜dp0 \ 7zip \ config.txt」+「%〜dp0 \ .....」 –

回答

1
string m1, m2, m3, m4; // put some nice file paths in here 

using (var m4Stream = File.Create(m4)) { 
    using (var m1Stream = File.OpenRead(m1)) { 
     m1Stream.CopyTo(m4Stream, 512); 
    } 
    using (var m2Stream = File.OpenRead(m2)) { 
     m2Stream.CopyTo(m4Stream, 512); 
    } 
    using (var m3Stream = File.OpenRead(m3)) { 
     m3Stream.CopyTo(m4Stream, 512); 
    } 
} 

略有更多的精力這段代碼可以推廣到採用任何數量的輸入文件,不完全是三人。我留下了512的緩衝區大小以匹配PowerShell代碼,但您最好不要離開它,所以CopyTo可以使用它自己的緩衝區大小。在PowerShell中,這是必需的,因爲流水線會以字節爲單位操作字節,但CopyTo並不那麼天真。

+0

任何使用' File.OpenWrite'而不是'File.Create'在這裏?這將截斷你 –

+1

@JonSkeet:沒有理由,除了我沒有所有的方法和重載'文件'立即駐在我腦袋。編輯,謝謝。 (實際上,甚至更好的方法是立即將SetLength設置爲三個文件合併的大小,因爲這會加速生成的副本並減少碎片,但它不再等同於PowerShell命令的作用做的事情。) –