2013-03-10 48 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