2015-09-08 46 views
-1
IdFTP_Main.Get('test.ini',MemoryStream); 
MemoryStream.Read(Buffer,MemoryStream.Size); 
SetString(TempStatus, PChar(MemoryStream.Memory), MemoryStream.Size div SizeOf(WideChar)); 

test.ini包含一個簡短的純文本字符串。內存大小MemoryStream.Size表示8,這是正確的。 TempString的內容是超過一百個控制字符。所有幫助讚賞。Delphi XE8:MemoryStream充滿垃圾

編輯:此代碼將產生正確的文件,但要求我寫一個副本,這是不安全的:

IdFTP_Main.Get('test.ini',MemoryStream); 
MemoryStream.Position := 0; 
MemoryStream.SaveToFile('./test.ini'); 
+1

該文件是什麼編碼?是不是沒有BOM的UTF-16LE?你爲什麼要讀入Buffer? –

+0

可能會更清晰地使用正確編碼的字符串流。 –

+0

該文件是Linux中的文本文件。 –

回答

2

你是治療流好像是UTF-16LE編碼。我懷疑事實並非如此。你需要確定編碼。然後,使用一個字符串流是這樣的:

var 
    Stream: TStringStream; 
    Str: string 
.... 
Stream := TStringStream.Create('', TEncoding.UTF8); 
try 
    IdFTP_Main.Get('test.ini', Stream); 
    Str := Stream.DataString; 
finally 
    Stream.Free; 
end; 

還是一個字節流是這樣的:

var 
    Stream: TBytesStream; 
    Str: string 
.... 
Stream := TBytesStream.Create; 
try 
    IdFTP_Main.Get('test.ini', Stream); 
    Str := TEncoding.UTF8.GetString(Stream.Bytes, 0, Stream.Size); 
finally 
    Stream.Free; 
end; 

我在編碼猜測。您需要替換正確的編碼。

在這種情況下,調用流的Read方法是沒有意義的。我剛剛忽略了這一點。

我們看不到您如何配置TIdFTP對象。 TransferType設置是否正確?爲了進一步調試,請使用上面的字節流代碼並轉儲下載的字節。檢查它們是否符合你的期望。

+0

@Remy謝謝您的編輯 –

+0

StringStream給了我這個文本:'ຫນ我'#0#0#0#0#0#0#0#0#0#0'⥠À'#0#0#0# 0'ֹҰ '#2#1#0#9#0'IsPressed' #0'r '#0'ֹҰ' #2#1#0#$ B#0'IsMouseOver '#0'ֹ' # 1#0#7#0 '躰ָ軐ָ軰ָ輐ָ輰ָ轐ָ轟ָֹҰ' #2#1#0#$ B#0'IsMouseOver '#0'ֹҰ' #2#1# 0#$ B#0'IsMouseOver '#0'ֹҰ' #2#1#0#9#0'IsPressed '#0'r' #0'ֹҰ '#2#1#0#9#0' IsPressed '#0'r' #0'ֹҰ '#2#1#0#$ B#0'IsMouseOver' #0'ֹҰ '#2#1#0#9#0'IsPressed' #0'r '#0'ֹS' #$ 008C#$ DA00 '䋽耀䅙둸¹' #0#0' 䊣 '#$ DA00' 䋽倀䊾 '#0#0'ֹ즰' #$ 008D '澈ু' #$ FFFF#$#FFFF 0#0#0#0#0#0#0#0#0#0#0 'ּֹ즰' #$008D'Õ'#$ FFFF#$#FFFF 0# 0#0#0#0#0#0#0#0#0#0#0'ֹҰ'#2#1#0#$ B#0'REST STREAM'#0'ֹҰ'#2#1 #0#$ A#0'SITE MKDIR'#0#$0A0D'ֹҰ'#2#1#0#$ B#0'LANG en-US *'#0'ֹ' –

+0

您還沒有解決了編碼問題。你知道文本編碼是什麼嗎?字節流變體中下載的字節是多少?它們是否與您使用的編碼相匹配?這個文件是否有BOM? –