通过File.ReadAllBytes()方法的同步操作异常

时间:2012-06-26 18:21:41

标签: c# .net file-io asynchronous

我创建了一个简短的代码,我得到了这个例外:

句柄不支持同步操作。可能需要更改FileStream构造函数的参数以指示句柄是异步打开的(即,它是为重叠的I / O显式打开的。)

代码是这样的:

byte[] filebytes = File.ReadAllBytes(filepath);
List<byte> codedbytes = new List<byte>();
byte constbyte = 240;
int blocksize = 67108864;
int counter = 0;
List<int> tempindex = new List<int>();
int index = 0;

private void DoTheJob()
{

        [...]

        for (int i = 0; i < filebytes.Length; i++,counter++)
        {
            codedbytes.AddRange(BitConverter.GetBytes(Convert.ToChar((filebytes[i] * constbyte))));
            if (counter == blocksize)
            {
                FileStream tempwriter = File.Create(startdir + "\\temp" + index.ToString() + ".file");

                for (int x = 0; x < codedbytes.Count; x++)
                {
                    tempwriter.WriteByte(codedbytes[x]);
                }

                tempwriter.Close();
                codedbytes.Clear();
                counter = 0; tempindex.Add(index); index++;
            }
        }

        [...]

        for (int x = 0; x < tempindex.Count; x++)
        {
            ▉Exception at this line▉▶ codedbytes = new List<byte>(File.ReadAllBytes(startdir + "\\temp" + tempindex[x].ToString() + ".file"));

            [...]
        }
}

我不知道是什么问题,因为FileStrem类没有重载的构造函数,我关闭了每个对象。

请以正确的方式告诉我!

1 个答案:

答案 0 :(得分:0)

我认为问题是你只关闭FileStream而不是处理FileStream。我想可能有一个与该文件关联的资源,该资源不是由close发布的,但可能与Dispose一起发布。提到异常的构造函数可能是尝试执行File.ReadAllBytes时创建的FileStream。

试试这个:

private void DoTheJob()
{

        [...]

        for (int i = 0; i < filebytes.Length; i++,counter++)
        {
            codedbytes.AddRange(BitConverter.GetBytes(Convert.ToChar((filebytes[i] * constbyte))));
            if (counter == blocksize)
            {
                using (FileStream tempwriter = File.Create(startdir + "\\temp" + index.ToString() + ".file"))
                {
                    for (int x = 0; x < codedbytes.Count; x++)
                    {
                        tempwriter.WriteByte(codedbytes[x]);
                    }               
                }

                codedbytes.Clear();
                counter = 0; tempindex.Add(index); index++;
            }
        }

        [...]

        for (int x = 0; x < tempindex.Count; x++)
        {
            codedbytes = new List<byte>(File.ReadAllBytes(startdir + "\\temp" + tempindex[x].ToString() + ".file"));

            [...]
        }
}