只是要关闭一个文件而已,翻遍baidu google无结果,这个问题真的这么难吗?(悬赏从不低于100)

老龙友 2008-12-11 11:07:42
用streamwriter写一个.csv文件,最后用streamwriter.close方法关闭文件
看起来似乎很简单,但问题就在于:不知为何,虽然我已经用close方法关闭文件了,但文件却依然被锁定,以至于下次再调用该子程序写入时,提示文件被锁定。

即使我用了close,dispose等各种方法关闭文件并释放资源,甚至这个winform都关闭了,只要整个程序还没退出,文件就是锁定的。我是用excel去打开它来验证是否锁定的。excel会提示:

delayrecord.csv正处于锁定状态
“另一用户”正在编辑

源程序如下:
dim strDelayRecordPath = "C:\abc.csv"
strContents = "ABC"
Dim sw As StreamWriter = File.CreateText(strDelayRecordPath)
sw.Write(strContents)
sw.WriteLine("")
sw.Flush()
sw.Close()

难道这是vs 2008的bug 吗???
...全文
222 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
HDNGO 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hm7921936 的回复:]
引用 2 楼 andywongz 的回复:
知道为什么了

原来是微软的垃圾回收机制有问题

我后面用了一个子程序把这个文件以附件的形式发送出去
想必是发送时打开了该文件,但是在子程序结束时并没有关闭文件

如下代码:

msgEmail.Attachments.Add(New System.Net.Mail.Attachment(strDelayRecordPath))

tmpClient.Send(msgEmail)


只要在后面再加一行代码主动去释放它就好了


msg…
[/Quote]

up~
老龙友 2009-01-12
  • 打赏
  • 举报
回复
这个不能算是垃圾回收的问题 垃圾回收是根据对象有无直达引用来确定的。
这里明显发在送的时候要读,读的时候需要锁定的。
GC并不知道并不知道你什么时候发送完毕。 这个时候就需要你自己处理这个对象了。
这个文件的句柄的引用还在msgEmail对象中,属于可直达对象,系统不会自动进行回收,即使进行回收GC的执行时间也是不确定的,只有GC回收了msgEmail对象才会自动释放你的句柄,但是很显然,这是无法预期的。
LZ可以看看关于垃圾回收的概念。

=======================

谢谢!学习了!
老龙友 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hm7921936 的回复:]
msgEmail.Attachments.Add(New System.Net.Mail.Attachment(strDelayRecordPath))

tmpClient.Send(msgEmail)


只要在后面再加一行代码主动去释放它就好了


msgEmail.Attachments(0).Dispose()

小文件没问题。
如果是大文件可能在你释放之前他还没发送完毕。 以前用JMAIL发附件也遇到过
[/Quote]

不会存在这个问题的,别忘了,程序是单线程的。
当msgEmail.Attachments(0).Dispose()执行的时候,tmpClient.Send(msgEmail)已经执行完毕了。
wuyq11 2008-12-17
  • 打赏
  • 举报
回复
关闭文本进程。再用GC释放
jimhard718 2008-12-17
  • 打赏
  • 举报
回复
学习!同意这个好像不太属于垃圾回收的问题。靠自己才好把。MS的垃圾回收。。。。。不是很信任啊!
josephSC 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wangping_li 的回复:]
哎,又是Dispose的问题,重要的东西最好自己Dispose下
[/Quote]
up~~
LYDF4151 2008-12-12
  • 打赏
  • 举报
回复
你是否使用另一个程序打开了“ABC.CSV”文件。
Dim strcontents As String
Dim strDelayRecordPath = "C:\q.csv"
strContents = "ABC"
Dim sw As System.IO.StreamWriter = System.IO.File.CreateText(strDelayRecordPath)
sw.Write(strContents)
sw.Flush()
sw.Close()
‘--
sw.dispose
sw=nothing

byte377 2008-12-12
  • 打赏
  • 举报
回复
UP
hm7921936 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 andywongz 的回复:]
知道为什么了

原来是微软的垃圾回收机制有问题

我后面用了一个子程序把这个文件以附件的形式发送出去
想必是发送时打开了该文件,但是在子程序结束时并没有关闭文件

如下代码:

msgEmail.Attachments.Add(New System.Net.Mail.Attachment(strDelayRecordPath))

tmpClient.Send(msgEmail)


只要在后面再加一行代码主动去释放它就好了


msgEmail.Attachments(0).Dispose()
[/Quote]

这个不能算是垃圾回收的问题 垃圾回收是根据对象有无直达引用来确定的。
这里明显发在送的时候要读,读的时候需要锁定的。
GC并不知道并不知道你什么时候发送完毕。 这个时候就需要你自己处理这个对象了。
这个文件的句柄的引用还在msgEmail对象中,属于可直达对象,系统不会自动进行回收,即使进行回收GC的执行时间也是不确定的,只有GC回收了msgEmail对象才会自动释放你的句柄,但是很显然,这是无法预期的。
LZ可以看看关于垃圾回收的概念。
nmd002 2008-12-12
  • 打赏
  • 举报
回复
学习,长知识
hm7921936 2008-12-12
  • 打赏
  • 举报
回复
msgEmail.Attachments.Add(New System.Net.Mail.Attachment(strDelayRecordPath))

tmpClient.Send(msgEmail)


只要在后面再加一行代码主动去释放它就好了


msgEmail.Attachments(0).Dispose()

小文件没问题。
如果是大文件可能在你释放之前他还没发送完毕。 以前用JMAIL发附件也遇到过
lq20051610211 2008-12-12
  • 打赏
  • 举报
回复
已经解决了??
lovehongyun 2008-12-12
  • 打赏
  • 举报
回复
加个强制回收试试,不知道你的代码是怎么写的.
GC.Collect();
lovehongyun 2008-12-12
  • 打赏
  • 举报
回复
static void Main(string[] args)
{
string strDelayRecordPath = @"c:\abc.csv";
string strContents = "ABC";
StreamWriter sw = System.IO.File.CreateText(strDelayRecordPath);
sw.Write(strContents);
sw.WriteLine("");
sw.Flush();
sw.Close();
}


我试了一下程序没有问题


wzuomin 2008-12-12
  • 打赏
  • 举报
回复
尽可能自己资源释放
dq512000 2008-12-11
  • 打赏
  • 举报
回复
学习。。。。
yanlongwuhui 2008-12-11
  • 打赏
  • 举报
回复
资源没及时回收吧
老龙友 2008-12-11
  • 打赏
  • 举报
回复
知道为什么了

原来是微软的垃圾回收机制有问题

我后面用了一个子程序把这个文件以附件的形式发送出去
想必是发送时打开了该文件,但是在子程序结束时并没有关闭文件

如下代码:

msgEmail.Attachments.Add(New System.Net.Mail.Attachment(strDelayRecordPath))

tmpClient.Send(msgEmail)


只要在后面再加一行代码主动去释放它就好了


msgEmail.Attachments(0).Dispose()
Gosp5 2008-12-11
  • 打赏
  • 举报
回复
Dim sw As New IO.StreamWriter("C:\abc.csv", True, System.Text.Encoding.GetEncoding(932))
Dim strContents = "ABC"
sw.Write(strContents)
sw.WriteLine("")
sw.Close()
wangping_li 2008-12-11
  • 打赏
  • 举报
回复
哎,又是Dispose的问题,重要的东西最好自己Dispose下
加载更多回复(1)

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧