2012-09-25 119 views
-1

我無法將我的Stream轉換爲MemoryStream。我想這樣做,因爲我想刪除已上傳到FTP服務器的文件。當我嘗試刪除或移動文件到另一個文件夾時,我得到一個異常,告訴我該文件正在被另一個進程使用。此應用程序的目的是將文件上傳到FTP服務器,並將文件移動到存檔文件夾。這是我的代碼:將流轉換爲MemoryStream

public void UploadLocalFiles(string folderName) 
     { 
      try 
      { 

       string localPath = @"\\Mobileconnect\filedrop_to_ssis\" + folderName; 
       string[] files = Directory.GetFiles(localPath); 
       string path; 

       foreach (string filepath in files) 
       { 
        string fileName = Path.GetFileName(filepath); 
        localFileNames = files; 
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp:......./inbox/" + fileName)); 
        reqFTP.UsePassive = true; 
        reqFTP.UseBinary = true; 
        reqFTP.ServicePoint.ConnectionLimit = files.Length; 
        reqFTP.Credentials = new NetworkCredential("username", "password"); 
        reqFTP.EnableSsl = true; 
        ServicePointManager.ServerCertificateValidationCallback = Certificate; 
        reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 

        FileInfo fileInfo = new FileInfo(localPath + @"\" + fileName); 
        FileStream fileStream = fileInfo.OpenRead(); 

        int bufferLength = 2048; 
        byte[] buffer = new byte[bufferLength]; 

        Stream uploadStream = reqFTP.GetRequestStream(); 

        int contentLength = fileStream.Read(buffer, 0, bufferLength); 
        var memoStream = new MemoryStream(); 
        uploadStream.CopyTo(memoStream); 
        memoStream.ToArray(); 
        uploadStream.Close(); 

        while (contentLength != 0) 
        { 
         memoStream.Write(buffer, 0, bufferLength); 
         contentLength = fileStream.Read(buffer, 0, bufferLength); 

        } 
       } 

       reqFTP.Abort(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Error in GetLocalFileList method!!!!!" + e.Message); 
      } 

     } 

當我到這行代碼:

uploadStream.CopyTo(memoStream); 

我得到一個異常告訴我,這個流着讀。

我該如何解決這個問題?

+0

在移動文件之前,您需要完成讀取上傳流的操作。 – Liam

+0

uploadstream正在鎖定該文件,我不明白爲什麼以及在何處 – Lahib

回答

1

uploadStream.CopyTo(memoStream);失敗,因爲您嘗試複製只寫FTP請求流。我不確定你的代碼在做什麼(在一個地方進行許多複製/讀取操作),所以我不能推薦你修復它。

另外您的FileStream正在鎖定文件。您的代碼缺少using構造或CloseDispose至少調用fileStream對象。

邊注:使用using是顯著更容易,對於通過手中的每個流寫try/finally(請注意,您的代碼不會關閉流在例外的情況下,因爲你不打電話來關閉內部finally)。

+0

當使用''using'應用程序包圍我的文件流不會將文件上傳到FTP服務器出於某種原因 – Lahib