Code Bye

C# 读取文件 使用后无法删除,占用问题

做了一个上传图片的小函数,读取指定目录下的图片,并上传至服务器,之后删除图片,但是无法删除,总是报异常。但是在另一个函数就可以删掉,但是最后一个图片显示资源占用,无法删除。
代码:(希望可以给点思路啥的)
private bool UploadImage(Socket sockClient)
{
bool flag = true;
DirectoryInfo dir = new DirectoryInfo(@”FingerImage”);
try
{
foreach (FileInfo fileInfo in dir.GetFiles(“*.bmp”))
{
MessageBox.Show(fileInfo.Name,”INFO”);
byte[] nameTemp = Encoding.Default.GetBytes(Path.GetFileName(fileInfo.FullName));
byte[] recvBuf = new byte[32];

FileStream picture = fileInfo.OpenRead();
//FileStream picture = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read);
byte[] picsize = new byte[picture.Length + 4096];
BinaryReader picread = new BinaryReader(picture);
picread.Read(picsize, 0, picsize.Length – 1);
picread.Close();
picture.Close();
string nameStr = “IMAGE<#>” + Encoding.UTF8.GetString(nameTemp).Length + “<#>” + Encoding.UTF8.GetString(nameTemp) + “<#>” + picsize.Length + “<#>|END|”;
byte[] name = Encoding.UTF8.GetBytes(nameStr);
//发送图片名
sockClient.Send(name);
//接受反馈
int iRet = sockClient.Receive(recvBuf);
if (iRet == 0)
{
MessageBox.Show(“服务器异常”, “提示:”);
flag = false;
}
else
{
if (String.Compare(Encoding.Default.GetString(recvBuf), “YES”) == 0)
{
sockClient.Send(picsize);
//发送图片
iRet = sockClient.Receive(recvBuf);
if (iRet == 0)
{
MessageBox.Show(“服务器异常”, “提示:”);
flag = false;
}
else
{
if (String.Compare(Encoding.Default.GetString(recvBuf), “YES”) == 0)
{
MessageBox.Show(“上传成功”, “提示:”);
}
else
{
lab_msg.Text = Encoding.Default.GetString(recvBuf);
flag = false;
}
}
}
else
{
MessageBox.Show(Encoding.Default.GetString(recvBuf), “提示:”);
flag = false;
}
}
//fileInfo.Delete();无法删除,报异常
}
//dir.Delete();无法删除,报异常
}
catch (Exception)
{
MessageBox.Show(“客户端异常”, “INFO”);
}
return flag;
}

解决方案

10

filestream没有dispose,占用了程序,using或在最后的代码前面加个dispose就可以了

25

你是使用“只读”方式打开文件的,所以这里的问题应该不是这里造成的。应该看看其它代码——创建文件的代码,它可能没有执行相似 picture.Close() 这样的操作。
使用 using{ } 结构可以确保关闭文件,而不需要你本人手写 .Close()、.Dispose() 这类代码。少写代码就可以避免错误。
但是应该是在其它的、你没有贴出的代码中的出现的这个问题。

10

起始不需要用 Stream 读取文件
byte[] imageBuffer = System.IO.ReadAllBytes(path);
就可以了。
从你的思路来看,应该希望批量上传图片到服务器端
起始你可以这样做
bool UploadImage(path string) {
1、在方法中创建 Socket 并连接服务器,
2、读取文件 byte[]
3、用 binarywriter 整合一个待发送的 data byte[] ,
例如:datatype int byte[4],task id GUID byte[16] 或文件 Md5 byte[16],
pathLen int byte[4],path byte[pathLen]、dataLen int byte[4], data [dataLen]
服务器端可以用 binaryreader 读取
4、发送数据 data
5、接收返回标识,标识可以是 task id 或 Md5
6、根据标识 获取成功/失败
7、关闭 Socket
8、返回成功/失败
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 读取文件 使用后无法删除,占用问题