2010-04-27 147 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