兄弟有一事不明,问题已经解决,但不得要领,请高手?(100分)

  • 主题发起人 主题发起人 ndust
  • 开始时间 开始时间
N

ndust

Unregistered / Unconfirmed
GUEST, unregistred user!
本人写了一个isapi的程序,生成一个excel临时文件,文件名随即,自动送回客户端,然后删除临时文件,
语句如下:
strname随机文件名,已经生成完毕.
mm:=TMemoryStream.Create;
mm.LoadFromFile(strname);
a.Connected:=false;
mm.Position:=0;
response.SetCustomHeader('Content-Disposition','attachment;filename=计划表.xls');
response.ContentType:='application/zip';
response.ContentStream:=mm;
response.SendResponse;
mm.Free;
if DeleteFile(strname) then
response.Content:='ok'+strname
else
response.Content:='NO'+strname;
文件不能删除.
改为:
mm:=TMemoryStream.Create;
mm.LoadFromFile(strname);
a.Connected:=false;
if DeleteFile(strname) then
response.Content:='ok'+strname
else
response.Content:='NO'+strname;
mm.Position:=0;
response.SetCustomHeader('Content-Disposition','attachment;filename=计划表.xls');
response.ContentType:='application/zip';
response.ContentStream:=mm;
response.SendResponse;
mm.Free;
就正常了.

哪位高手能解释原因,谢谢!
 
真的没人知道吗?
 
会不会文件其实是已经删除了,只是没有提示?
这样会不会正确,如果会就是这个问题:
mm:=TMemoryStream.Create;
mm.LoadFromFile(strname);
a.Connected:=false;
mm.Position:=0;
response.SetCustomHeader('Content-Disposition','attachment;filename=计划表.xls');
response.ContentType:='application/zip';
response.ContentStream:=mm;
if DeleteFile(strname) then
response.Content:='ok'+strname
else
response.Content:='NO'+strname;
response.SendResponse;
mm.Free;
 
你一种方法最后终将文件给删除了呀,
而TMemoryStream的LoadFromFile方法其实就是建立了TFileStream的打开(而不是建立)该文件,而后LoadFromStream。但TFileStream的Create方法过程是FileOpen而不是FileCreate;若该文件不存在当然就会引发一个异常咯。
而第二种方法没有能删除文件,文件正在打开呀。最终临时文件没有删除。
其实我认为都是有点错误,有必要删除吗(反正删除不了呀)????直接读原文件也是一样的啦!!!!!
呵呵~~~~~~~~~~~~~~~~~
 
不是,我是在数据库中抽取的数据,最后形成一个excel文件,提交给用户,提交后删除临时文件,第一种方法提交数据正确,而且也把临时文件删除了,第二种方法提交文件正确,但是不能删除临时文件,我不知道其中的原因是怎么回事?
 
>>response.ContentType:='application/zip';
这一句是不是不妥?应该改成xml的ContentType,而不应该是zip文件的ContentType?
 
没有关系吧,因为只是文件删除不了,如果先删除就可以。
 
唉,你的说法前后严重不统一,开始说:
语句如下:
........
文件不能删除.
改为:
....
就正常了.
然后又说:
第一种方法提交数据正确,而且也把临时文件删除了,第二种方法提交文件正确,但是不能删除临时文件,
究竟哪个行哪个不行?我都给你搞糊涂了。

我觉得第一个方法应该没问题的,第二个方法中文件正在使用,当然不能删除了。
****************************************************************************
 
第一种方法时, 你在执行完mm.Free一句后,检查一下文件是否还存在,如果不存在了,证明只是文件删除的信息没有被发送出来,而并不是文件没有被删除。你注意检查一下
if DeleteFile(strname) then
response.Content:='ok'+strname
else
response.Content:='NO'+strname
后面有没有发送Response的语句,如果没有的话,文件删除结果的信息当然不会显示出来了。
 
可能是我没有说明白:
第一种写法:
mm:=TMemoryStream.Create;
mm.LoadFromFile(strname);
a.Connected:=false;
mm.Position:=0;
response.SetCustomHeader('Content-Disposition','attachment;filename=计划表.xls');
response.ContentType:='application/zip';
response.ContentStream:=mm;
response.SendResponse;
mm.Free;
if DeleteFile(strname) then
response.Content:='ok'+strname
else
response.Content:='NO'+strname;
可以改为:
mm:=TMemoryStream.Create;
mm.LoadFromFile(strname);
a.Connected:=false;
mm.Position:=0;
response.SetCustomHeader('Content-Disposition','attachment;filename=计划表.xls');
response.ContentType:='application/zip';
response.ContentStream:=mm;
response.SendResponse;
mm.Free;
DeleteFile(strname);
这时能看到生成一个电子表格文件,同时IE下载了这个文件。但是文件没有被删除,因无法调试,最后语句的deletefile没能删除文件。
改为第二种方法:
mm:=TMemoryStream.Create;
mm.LoadFromFile(strname);
a.Connected:=false;
DeleteFile(strname);
mm.Position:=0;
response.SetCustomHeader('Content-Disposition','attachment;filename=计划表.xls');
response.ContentType:='application/zip';
response.ContentStream:=mm;
response.SendResponse;
mm.Free;
这时能看到生成一个电子表格文件,同时IE下载了这个文件。接着这个文件也被删除了。
我就是不明白这个地方的原因。
 
单单看给出的这段程序,真的没太多理由会这样,
或许response.SendResponse; mm.Free;之后的语句根本就没有机会执行?可以试试在第一种方法中令它删除一个明确存在的其它文件看能不能删除就明白是不是这个原因了。只是猜想,不一定正确的。 或者把DeleteFile(strname);这句依次向后移动几次,每次移动一行,看究竟移到哪里就不行了,再探求原因。
 
后退
顶部