2013-03-10 81 views
0

我的工作在Lotus Notes的API,我來到了一個點的過程中,其中fucntio像這樣,C法FREAD()等同於C#

bytesRead = fread (Buffer, 1, (WORD) Length, hCDFile); 

現在,我發現了一些C#等效的方法一樣,它在while循環內運行。在第一次迭代中,該方法似乎工作正常(當我調試c版本的代碼和C#版本時,結果相同)。但在第二次迭代中說這個方法我打電話另一個方法

NSFDUMPReadFromFile(hCDFile, ref RecordTypeCanonicalPtr, sizeof (ushort))它調用fread功能並給出值RecordTypeCanonicalPtr=149之前假設dwLengthHost = 35, 的值。但之後,當相同的方法稍後調用時,RecordTypeCanonicalPtrdwLengthHost值會自動更改。

[DllImport("msvcrt.dll")] 
public static extern UInt32 fread(ref IntPtr Buffer, uint Size, uint Count, IntPtr Stream); 

private bool NSFDUMPReadFromFile(IntPtr hCDFile, 
             ref IntPtr Buffer, 
             UInt32 Length) 
{ 
    UInt32 bytesRead = NotesApi.fread(ref Buffer, 1, (uint)Length, hCDFile); 
    /* Read bytes from the file */ 
    if (bytesRead == Length) 
     return true; 
    else 
     return false; 
} 

回答

1

看起來像你需要使用FileStream

您可以通過使用File.Open

完全一樣的行爲,將其創建爲:

bytesRead = fread (Buffer, 1, (WORD) Length, hCDFile); 

應提供以下的C#代碼

bytesRead = file.Read(Buffer, 0, Length) 

完整的例子可能是以下

using(file = File.Open("test.bin", FileMode.Open)) 
{ 
    var length = 256; 
    var buffer = new byte[length]; 
    var bytesRead = file.Read(buffer, 0, length); 
} 
+0

您好,感謝您的回覆。 實際上我必須使用指針,並且此方法用於不同的條件。在某些情況下,它會返回databuffer,一些套管記錄類型。所以不要認爲上述方法適用於所有情況。 – Binayacharya 2013-03-10 08:55:46

+0

你在使用IntPtr還是使用文件中光標位置的指針? 如果您正在使用IntPtr,則無法讀取適合您的文件的方法。但是,無論如何,只要您需要使用['Marshal.Copy'](http://msdn.microsoft.com/ru-ru/library/system)將字節數組複製到非託管內存中,就可以使用建議的方式來讀取文件。 runtime.interopservices.marshal.copy.aspx) – 2013-03-10 18:29:34

+0

大家好,其實我發現mscrolib.dll幫我了。 – Binayacharya 2013-06-04 07:56:56