2010-04-27 66 views
2

这是ASP Classic中将文件保存到磁盘的一种方法。这需要很长时间,但我不知道为什么。通常情况下,我不介意这么多,但它处理的文件非常大,所以需要这个需求比100kB快一秒的存储。严重缓慢。 (旧的遗留系统,创可贴修复,直到它被替换...)ASP SaveToDisk方法需要很多时间

Public Sub SaveToDisk(sPath) 
     Dim oFS, oFile 
     Dim nIndex 

     If sPath = "" Or FileName = "" Then Exit Sub 

     If Mid(sPath, Len(sPath)) <> "\" Then sPath = sPath & "\" '" 

     Set oFS = Server.CreateObject("Scripting.FileSystemObject") 
     If Not oFS.FolderExists(sPath) Then Exit Sub 

     Set oFile = oFS.CreateTextFile(sPath & FileName, True) 

     For nIndex = 1 to LenB(FileData) 
      oFile.Write Chr(AscB(MidB(FileData,nIndex,1))) 
     Next 

     oFile.Close 
    End Sub 

我这么问是因为有很多WTF的在这个代码,所以我打的火灾而获得这些的人一些帮助。

+0

您是否尝试过用调试器来查看哪些语句特别慢,或者在每个语句之间放置某种记录步骤以查看需要花费多长时间?我怀疑这是造成你大部分心痛的单一声明。 – SqlRyan 2010-04-27 15:47:23

+0

偏题:你可以通过'If Right(sPath,1)<>“\”然后sPath = sPath&“\”'来改变你对斜线的测试。 – Filburt 2010-04-27 20:20:07

+0

我还没有放置任何日志记录,因为这将包括写入文件... – Dann 2010-04-28 09:45:11

回答

1

我没有在代码中的任何地方看到“FileData”的定义 - 这是从哪里来的?你是否有理由一次将它写入磁盘一个字符?我怀疑这是你的问题 - 编写100K的数据需要100K次循环,这可能是你减速的原因。用一个语句来一次全部写入文件

For nIndex = 1 to LenB(FileData) 
    oFile.Write Chr(AscB(MidB(FileData,nIndex,1))) 
Next 

:你为什么不能更换底部的写循环?

oFile.Write FileData 
+0

-1。这会破坏数据。 OP发布了一个非常好的解决方案,将任意文件上传到ASP服务器,在这里第三方dll不存在协助。解决方案的问题在于'Write'方法将尝试将Unicode映射到ANSI代码页,其中真正需要的是逐字存储内容。 – AnthonyWJones 2010-04-28 09:46:50

+0

关于这个unicode VS ANSI事情,我解决这个使用简单的查找表(的Jscript): VAR unicodeToAnsi = { 8364:\t 128,\t 129:\t 129,\t 8218:\t 130,\t 402:\t 131, 8222:\t 132,\t 8230:\t 133,\t 8224:\t 134,\t 8225:\t 135, 710:\t 136,\t 8240:\t 137,\t 352:\t 138,\t 8249:\t 139, 338:\t 140,\t 141:\t 141,\t 381:\t 142,\t 143:\t 143, 144:\t 144,\t 8216:\t 145,\t 8217:\t 146,\t 8220:\t 147 , 8221:\t 148,\t 8226:\t 149,\t 8211:\t 150,\t 8212:\t 151, 732:\t 152,\t 8482:\t 153,\t 353 :\t 154,\t 8250:\t 155, 339:\t 156,\t 157:\t 157,\t 382:\t 158,\t 376:}; – 2010-05-06 17:11:25

1

你应该做的是阅读的二进制请求转换成ADODB.Stream对象并将其转换为ASCII纯文本在一个快速的一步。

Set objStream = Server.CreateObject("ADODB.Stream") 

    objStream.Type = 1 
    objStream.Open 
    objStream.Write Request.BinaryRead(Request.TotalBytes) 
    objStream.Position = 0 
    objStream.Type = 2 
    objStream.Charset = "ISO-8859-1" 

    FormData = objStream.ReadText 

    objStream.Close 

Set objStream = Nothing 

请注意,变量FormData现在如何将表单数据包含为文本。然后解析这些文本并找到每个文件的开始和长度,并使用ADODB.Stream CopyTo方法来提取文件的特定部分并将其保存为磁盘。

+0

干杯,我会尽快去吧 – Dann 2010-05-07 10:03:35

+0

这导致了解决方案,一个更完整的例子可以在这里找到:http://stackoverflow.com/questions/12190305/how-to-upload-files-with -Asp经典 – Fabian 2016-05-13 14:19:12