0

私のアプリケーションの目的は、ファイルを FTP サーバーにアップロードしてから、ローカル ファイルをアーカイブ フォルダーに移動することです。これが私のコードです:

public void UploadLocalFiles(string folderName)
        {
            try
            {

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

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

                    FileInfo fileInfo = new FileInfo(localPath + @"\" + fileName);
                    byte[] fileContents = new byte[fileInfo.Length];

                    FileStream fileStream = fileInfo.OpenRead();

                    fileStream.Read(fileContents, 0, Convert.ToInt32(fileInfo.Length));


                    Stream writer = reqFTP.GetRequestStream();

                    writer.Write(fileContents, 0, fileContents.Length);
                }

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

        }

このメソッドを実行した後、ファイルを移動できません。「ファイルにアクセスできません。ファイルは別のプロセスで使用されています」という例外メッセージが表示されます。ファイルをロックしているのは、Filestream または Stream です。Filestream と Stream を囲むとusing、FTP にファイルがアップロードされませんusing。理由がわかりません。誰かがこれを手伝ってくれますか?

4

2 に答える 2

2

問題は、ファイルの読み取りに使用しているファイルストリームにあります。

閉じる必要があります。

foreach ループの最後の直前に追加するfileStream.Close()だけです。

于 2012-09-26T10:02:54.403 に答える
1

完了したら、 FileStream.Disposeを使用してみてください。これは、'using' と同じ効果を持つはずです。

于 2012-09-26T07:03:04.637 に答える