1 回答

TA貢獻1817條經驗 獲得超14個贊
我正在自我回答這個問題,因為它可能是一個有點常見的問題,并且解決方案可以為其他人提供信息。
由于文檔包含二進制文件和文本,我們不能簡單地使用將StreamWriter二進制文件寫回另一個文件。即使當您使用StreamWriter讀取文件然后將所有內容寫入另一個文件時,您也會意識到文件之間的差異。
您可以使用BinaryWriter來搜索包含多個部分的文檔并將每個字節完全按照您在另一個文檔中找到的那樣寫入。
//Using a Binary Reader/Writer as the PDF is multitype
using (var reader = new BinaryReader(File.Open(_file.FullName, FileMode.Open)))
{
using (var writer = new BinaryWriter(File.Open(tempFileName.FullName, FileMode.CreateNew)))
{
//We are searching for the start of the PDF
bool searchingForstartOfPDF = true;
var startOfPDF = "%PDF-".ToCharArray();
//While we haven't reached the end of the stream
while (reader.BaseStream.Position != reader.BaseStream.Length)
{
//If we are still searching for the start of the PDF
if (searchingForstartOfPDF)
{
//Read the current Char
var str = reader.ReadChar();
//If it matches the start of the PDF signiture
if (str.Equals(startOfPDF[0]))
{
//Check the next few characters to see if they match
//keeping an eye on our current position in the stream incase something goes wrong
var currBasePos = reader.BaseStream.Position;
for (var i = 1; i < startOfPDF.Length; i++)
{
//If we found a char that isn't in the PDF signiture, then resume the while loop
//to start searching again from the next position
if (!reader.ReadChar().Equals(startOfPDF[i]))
{
reader.BaseStream.Position = currBasePos;
break;
}
//If we've reached the end of the PDF signiture then we've found a match
if (i == startOfPDF.Length - 1)
{
//Success
//Set the Position to the start of the PDF signiture
searchingForstartOfPDF = false;
reader.BaseStream.Position -= startOfPDF.Length;
//We are no longer searching for the PDF Signiture so
//the remaining bytes in the file will be directly wrote
//using the stream writer
}
}
}
}
else
{
//We are writing the binary now
writer.Write(reader.ReadByte());
}
}
}
}
此代碼示例使用BinaryReader1 對 1 地讀取每個字符,如果找到匹配的字符串%PDF-(PDF 開始簽名),它將閱讀器位置移回%,然后使用 寫入剩余文檔writer.Write(reader.ReadByte())。
- 1 回答
- 0 關注
- 126 瀏覽
添加回答
舉報