ASP SaveToDisk方法需要很多时间
这是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的在这个代码,所以我打的火灾而获得这些的人一些帮助。
我没有在代码中的任何地方看到“FileData”的定义 - 这是从哪里来的?你是否有理由一次将它写入磁盘一个字符?我怀疑这是你的问题 - 编写100K的数据需要100K次循环,这可能是你减速的原因。用一个语句来一次全部写入文件
For nIndex = 1 to LenB(FileData)
oFile.Write Chr(AscB(MidB(FileData,nIndex,1)))
Next
:你为什么不能更换底部的写循环?
oFile.Write FileData
-1。这会破坏数据。 OP发布了一个非常好的解决方案,将任意文件上传到ASP服务器,在这里第三方dll不存在协助。解决方案的问题在于'Write'方法将尝试将Unicode映射到ANSI代码页,其中真正需要的是逐字存储内容。 – AnthonyWJones 2010-04-28 09:46:50
关于这个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
你应该做的是阅读的二进制请求转换成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方法来提取文件的特定部分并将其保存为磁盘。
您是否尝试过用调试器来查看哪些语句特别慢,或者在每个语句之间放置某种记录步骤以查看需要花费多长时间?我怀疑这是造成你大部分心痛的单一声明。 – SqlRyan 2010-04-27 15:47:23
偏题:你可以通过'If Right(sPath,1)“\”然后sPath = sPath&“\”'来改变你对斜线的测试。 – Filburt 2010-04-27 20:20:07
我还没有放置任何日志记录,因为这将包括写入文件... – Dann 2010-04-28 09:45:11