FileStream Beginread [英] FileStream Beginread
问题描述
我无法上班。请帮忙...
-louie
hPipe = CreateFile(connectionString,
GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,0,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,HANDLE.Zero);
if((hPipe.ToInt32())== INVALID_HANDLE_VALUE )
{
blnConnected = false;
返回false;
< br $>
}
//开始asyncronys阅读
IAsyncResult iAR;
byte [] byRequest = new byte [4095];
iAR = myStream.BeginRead(byRequest,0,4096,ASyncFileC allBackRead(iAR),myStream)
;
public void ASyncFileCallBackRead(IAsyncResult iAR)
{
系统.Text.ASCIIEncoding EnAscii;
System.Text.ASCIIEncoding EnunI;
int byteCount;
string recData;
byte recReq [] = new byte [(Convert.ToByte(iAR.AsyncState)];
byteCount = myStream.EndRead(iAR);
recData = EnAscii.GetString(recReq,0,byteCount);
Lou< lo ******** @ comcast.net>写道:我不能让它工作。请帮忙...
-louie
< snikp>
byte [] byRequest = new byte [4095];
iAR = myStream.BeginRead(byRequest,0,4096,ASyncFileC allBackRead(iAR),myStream)
这是一个糟糕的开始 - 你已经要求它阅读最多4096
字节,但只分配4095.
public void ASyncFileCallBackRead(IAsyncResult iAR)
System.Text.ASCIIEncoding EnAscii;
System.Text.ASCIIEncoding EnUNI;
你要声明这些变量,但从不设置它们的值。
int byteCount;
string recData;
字节recReq [] =新字节[(Convert.ToByte(iAR.AsyncState)];
为什么要尝试转换iAR.AsyncState到一个字节,你为什么要创建一个新的字节数组?
我希望你通过byRequest作为你的状态,而不是
stream(因为你显然在其他地方有一个对流的引用 -
可能是一个好主意,将* both *放在州内,作为一个单独的
type),然后将其强制转换为字节数组。事实上,你完全无视你实际读过的内容。
-
Jon Skeet - < sk *** @ pobox.com>
http://www.pobox.com/~skeet
如果回复该群组,请不要给我发邮件
你能告诉我一个例子。
" Jon Skeet [C#MVP]" < SK *** @ pobox.com>在消息中写道
新闻:MP ************************ @ msnews.microsoft.c om ...Lou< lo ******** @ comcast.net>写道:我不能让它工作。请帮忙......
-louie
< snikp>
byte [] byRequest = new byte [4095];
iAR = myStream.BeginRead(byRequest,0,4096,ASyncFileC allBackRead(iAR),myStream)
这是一个糟糕的开始 - 你已经要求它阅读最多4096
字节,但只分配4095.
public void ASyncFileCallBackRead(IAsyncResult iAR)
System.Text.ASCIIEncoding EnAscii;
System.Text.ASCIIEncoding EnUNI;
你要声明这些变量,但从不设置它们的值。
int byteCount;
string recData;
byte recReq [] = new byte [(Convert.ToByte(iAR.AsyncState)];
为什么要尝试将iAR.AsyncState转换为字节,为什么要创建新的字节数组?
我希望你通过byRequest作为你的国家,而不是
流(因为你显然在其他地方引用了流 - 它可能是一个好主意,将* both *放在状态中,作为单独的
类型),然后只需将其强制转换为字节数组。事实上,你完全无视你实际阅读的内容。
- Jon Skeet - < sk *** @ pobox.com>
http://www.pobox.com/~skeet <如果回复该组,请不要给我发邮件
我的代码在vb> Net并需要将其转换为C#
它在VB .Net中运行良好????
VB代码
''得到管道
Private Sub btnClient_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs)处理btnClient.Click
pipeHandle = CreateFile(txtInput.Text,DesiredAccess.GENERIC_READ或
DesiredAccess.GENERIC_WRITE,_
ShareMode.FILE_SHARE_READ或ShareMode.FILE_SHARE_WRITE,_
secAttr,CreationDisposition.OPEN_EXISTING,_
FlagsAndAttributes.FILE_FLAG_OVERLAPPED,IntPtr.Zer o)
''确认我们有一个好的处理。
如果(pipeHandle.ToInt32()= INVALID_HANDLE_VALUE)那么
MessageBox.Show(无法打开管道端口, + _
确保它已安装且未使用。,_
pipePort错误, _
结束如果
''根据namedpipe句柄打开一个流。
试试
PS =新FileStream(pipeHandle,FileAccess.ReadWrite,True,4095,True)
''''显示成功消息。
lblPipeHandle.Text = pipeHandle.ToString
''开始异步读取
昏暗byRequest(4095)As Byte
DIM iAR As IAsyncResult
iAR = PS.BeginRead(byRequest,0,UBound(byRequest)+ 1 ,Address $>
ASyncFileCallBackRead,byRequest)
End Sub
Private Sub ASyncFileCallBackRead(ByVal iAR As IAsyncResult)
Dim EnASCII As New System.Text.ASCIIEncoding()
Dim EnUNI As New System.Text.UnicodeEncoding()
Dim byteCount As Integer
Dim recData As String
''获取iAR参数传递的数据
Dim recReq()As Byte = CType(iAR.AsyncState,Byte())
byteCount = PS.EndRead(iAR)''获取读取的字节数
如果是byteCount> 0然后
recData = EnASCII.GetString(recReq,0,byteCount)
End Sub
" Jon Skeet [C# MVP] QUOT; < SK *** @ pobox.com>在消息中写道
新闻:MP ************************ @ msnews.microsoft.c om ...Lou< lo ******** @ comcast.net>写道:我不能让它工作。请帮忙......
-louie
< snikp>
byte [] byRequest = new byte [4095];
iAR = myStream.BeginRead(byRequest,0,4096,ASyncFileC allBackRead(iAR),myStream)
这是一个糟糕的开始 - 你已经要求它阅读最多4096
字节,但只分配4095.
public void ASyncFileCallBackRead(IAsyncResult iAR)
System.Text.ASCIIEncoding EnAscii;
System.Text.ASCIIEncoding EnUNI;
你要声明这些变量,但从不设置它们的值。
int byteCount;
string recData;
byte recReq [] = new byte [(Convert.ToByte(iAR.AsyncState)];
为什么要尝试将iAR.AsyncState转换为字节,为什么要创建新的字节数组?
我希望你通过byRequest作为你的国家,而不是
流(因为你显然在其他地方引用了流 - 它可能是一个好主意,将* both *放在状态中,作为单独的
类型),然后只需将其强制转换为字节数组。事实上,你完全无视你实际阅读的内容。
- Jon Skeet - < sk *** @ pobox.com>
http://www.pobox.com/~skeet <如果回复小组,请不要给我发邮件
I can''t get it to work. Please help...
-louie
hPipe = CreateFile(connectionString,
GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,HANDLE.Zero);
if ((hPipe.ToInt32()) == INVALID_HANDLE_VALUE)
{
blnConnected=false;
return false;
}
//start an asyncronys read
IAsyncResult iAR;
byte[] byRequest=new byte[4095];
iAR=myStream.BeginRead(byRequest,0,4096,ASyncFileC allBackRead(iAR),myStream)
;
public void ASyncFileCallBackRead(IAsyncResult iAR)
{
System.Text.ASCIIEncoding EnAscii;
System.Text.ASCIIEncoding EnUNI;
int byteCount;
string recData;
byte recReq[]=new byte[(Convert.ToByte(iAR.AsyncState)];
byteCount=myStream.EndRead(iAR);
recData = EnAscii.GetString(recReq,0,byteCount);解决方案Lou <lo********@comcast.net> wrote:I can''t get it to work. Please help...
-louie
<snikp>
byte[] byRequest=new byte[4095];
iAR=myStream.BeginRead(byRequest,0,4096,ASyncFileC allBackRead(iAR),myStream)
That''s a bad start to begin with - you''ve asked it to read up to 4096
bytes, but only allocated 4095.
public void ASyncFileCallBackRead(IAsyncResult iAR)
{
System.Text.ASCIIEncoding EnAscii;
System.Text.ASCIIEncoding EnUNI;
You''re declaring these variables, but never setting their values.
int byteCount;
string recData;
byte recReq[]=new byte[(Convert.ToByte(iAR.AsyncState)];
Why are you trying to convert iAR.AsyncState to a byte, and why are you
creating a new byte array?
I would expect you to pass byRequest as your state, rather than the
stream (as you apparently have a reference to the stream elsewhere - it
might well be a good idea to put *both* in the state, as a separate
type), and then just cast it back to a byte array. As it is, you''re
completely ignoring whatever you''ve actually read.
--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet
If replying to the group, please do not mail me too
Can you please show me an example.
"Jon Skeet [C# MVP]" <sk***@pobox.com> wrote in message
news:MP************************@msnews.microsoft.c om...Lou <lo********@comcast.net> wrote:I can''t get it to work. Please help...
-louie
<snikp>byte[] byRequest=new byte[4095];
iAR=myStream.BeginRead(byRequest,0,4096,ASyncFileC allBackRead(iAR),myStream)
That''s a bad start to begin with - you''ve asked it to read up to 4096
bytes, but only allocated 4095.public void ASyncFileCallBackRead(IAsyncResult iAR)
{
System.Text.ASCIIEncoding EnAscii;
System.Text.ASCIIEncoding EnUNI;
You''re declaring these variables, but never setting their values.int byteCount;
string recData;
byte recReq[]=new byte[(Convert.ToByte(iAR.AsyncState)];
Why are you trying to convert iAR.AsyncState to a byte, and why are you
creating a new byte array?
I would expect you to pass byRequest as your state, rather than the
stream (as you apparently have a reference to the stream elsewhere - it
might well be a good idea to put *both* in the state, as a separate
type), and then just cast it back to a byte array. As it is, you''re
completely ignoring whatever you''ve actually read.
--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet
If replying to the group, please do not mail me too
I have the code in vb >Net and need to convert it to C#
It works great in VB .Net????
VB Code
''get handle to the pipe
Private Sub btnClient_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnClient.Click
pipeHandle = CreateFile(txtInput.Text, DesiredAccess.GENERIC_READ Or
DesiredAccess.GENERIC_WRITE, _
ShareMode.FILE_SHARE_READ Or ShareMode.FILE_SHARE_WRITE, _
secAttr, CreationDisposition.OPEN_EXISTING, _
FlagsAndAttributes.FILE_FLAG_OVERLAPPED, IntPtr.Zero)
'' Verify we have a good handle.
If (pipeHandle.ToInt32() = INVALID_HANDLE_VALUE) Then
MessageBox.Show("Can''t open the pipe port, " + _
"make sure it''s installed and not in use.", _
"pipePort Error", _
End If
'' Open a stream based on the namedpipe handle.
Try
PS = New FileStream(pipeHandle, FileAccess.ReadWrite, True, 4095, True)
'''' Display a success message.
lblPipeHandle.Text = pipeHandle.ToString
''start async read
Dim byRequest(4095) As Byte
Dim iAR As IAsyncResult
iAR = PS.BeginRead(byRequest, 0, UBound(byRequest) + 1, AddressOf
ASyncFileCallBackRead, byRequest)
End Sub
Private Sub ASyncFileCallBackRead(ByVal iAR As IAsyncResult)
Dim EnASCII As New System.Text.ASCIIEncoding()
Dim EnUNI As New System.Text.UnicodeEncoding()
Dim byteCount As Integer
Dim recData As String
''get the data passed in parameter of iAR
Dim recReq() As Byte = CType(iAR.AsyncState, Byte())
byteCount = PS.EndRead(iAR) ''get number of bytes read
If byteCount > 0 Then
recData = EnASCII.GetString(recReq, 0, byteCount)
End Sub
"Jon Skeet [C# MVP]" <sk***@pobox.com> wrote in message
news:MP************************@msnews.microsoft.c om...Lou <lo********@comcast.net> wrote:I can''t get it to work. Please help...
-louie
<snikp>byte[] byRequest=new byte[4095];
iAR=myStream.BeginRead(byRequest,0,4096,ASyncFileC allBackRead(iAR),myStream)
That''s a bad start to begin with - you''ve asked it to read up to 4096
bytes, but only allocated 4095.public void ASyncFileCallBackRead(IAsyncResult iAR)
{
System.Text.ASCIIEncoding EnAscii;
System.Text.ASCIIEncoding EnUNI;
You''re declaring these variables, but never setting their values.int byteCount;
string recData;
byte recReq[]=new byte[(Convert.ToByte(iAR.AsyncState)];
Why are you trying to convert iAR.AsyncState to a byte, and why are you
creating a new byte array?
I would expect you to pass byRequest as your state, rather than the
stream (as you apparently have a reference to the stream elsewhere - it
might well be a good idea to put *both* in the state, as a separate
type), and then just cast it back to a byte array. As it is, you''re
completely ignoring whatever you''ve actually read.
--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet
If replying to the group, please do not mail me too
这篇关于FileStream Beginread的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!