FileStream Beginread [英] FileStream Beginread

查看:69
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆