前提・実現したいこと
ftpでのアップロード処理を勉強し始めたところで、適当なtxtファイルをターゲットに転送する簡易ソフトを作ってみています。
大容量ファイルや大量のファイル転送の途中に切断が起きた場合に、streamがcloseされる様にしたいと考えています。現在のコードだと、処理中のエラーでcloseされずに進んでしまうと思うので、改良を検討しています。
調べてみたところ、try-finaly、usingなどを利用するようで、試しに修正してみました。
一応動いているのですが、修正は合っておりますでしょうか?より良い方法があれば、ご教示下さい。
またCloseする場合に関して、try-catch-finallyとusingの使い方・使い分けなどを宜しければご教示頂ければと思います。
宜しくお願い致します。
該当のソースコード
C#
1private void Button_Click(object sender, RoutedEventArgs e) 2 { 3 //アプリケーションパス取得 4 string exePath = Environment.GetCommandLineArgs()[0]; 5 string exeFullPath = System.IO.Path.GetFullPath(exePath); 6 string startupPath = System.IO.Path.GetDirectoryName(exeFullPath); 7 8 string path_D = startupPath + "\Work_Down\"; 9 string path_U = startupPath + "\Work_Up\"; 10 11 string Path = path_U; 12 string UpPath = "※※※※※"; 13 14 string ipAddress = "※※※※※"; 15 16 try 17 { 18 // ファイル名を取得する 19 string[] names; 20 21 names = Directory.GetFiles(path_U, "*.txt", SearchOption.AllDirectories); 22 23 // ファイル名をリストにする 24 List<string> files = new List<string>(); 25 26 foreach (var name in names) 27 { 28 if (name != "") 29 { 30 files.Add(name.Substring(name.LastIndexOf("\") + 1)); 31 } 32 } 33 34 //アップロード 35 foreach (var file in files) 36 { 37 //アップロードするファイル 38 string upFile = Path + file; 39 40 //アップロード先のURI 41 Uri u = new Uri("ftp://" + ipAddress + UpPath + file); 42 43 //FtpWebRequestの作成 44 FtpWebRequest ftpReq = (FtpWebRequest) 45 WebRequest.Create(u); 46 47 //ログインユーザー名とパスワードを設定 48 ftpReq.Credentials = new NetworkCredential("※※※", "※※※"); 49 50 //MethodにWebRequestMethods.Ftp.UploadFile("STOR")を設定 51 ftpReq.Method = WebRequestMethods.Ftp.UploadFile; 52 53 //要求の完了後に接続を閉じる 54 ftpReq.KeepAlive = false; 55 56 //バイナリモードで転送する 57 ftpReq.UseBinary = true; 58 59 //PASVモードを無効にする 60 ftpReq.UsePassive = false; 61 62 //タイムアウトを設定する 63 ftpReq.Timeout = 30000; 64 65 // ↓===ここから=== 66 67 //ファイルをアップロードするためのStreamを取得 68 Stream reqStrm = ftpReq.GetRequestStream(); 69 //アップロードするファイルを開く 70 FileStream fs = new FileStream(upFile, FileMode.Open, FileAccess.Read); 71 72 //アップロードStreamに書き込む 73 byte[] buffer = new byte[1024]; 74 while (true) 75 { 76 int readSize = fs.Read(buffer, 0, buffer.Length); 77 if (readSize == 0) 78 break; 79 reqStrm.Write(buffer, 0, readSize); 80 } 81 82 //閉じる 83 fs.Close(); 84 reqStrm.Close(); 85 86 // ↑ここまで 87 } 88 89 } 90 catch 91 { 92 } 93 }
試したこと
catch部の内容は省略しています。
C#
1//ファイルをアップロードするためのStreamを取得 2Stream reqStrm = ftpReq.GetRequestStream(); 3//アップロードするファイルを開く 4FileStream fs = new FileStream(upFile, FileMode.Open, FileAccess.Read); 5 6try 7{ 8 //アップロードStreamに書き込む 9 byte[] buffer = new byte[1024]; 10 while (true) 11 { 12 int readSize = fs.Read(buffer, 0, buffer.Length); 13 if (readSize == 0) 14 break; 15 reqStrm.Write(buffer, 0, readSize); 16 } 17} 18catch 19{ 20} 21finally 22{ 23 //閉じる 24 fs.Close(); 25 reqStrm.Close(); 26}
C#
1try 2{ 3 //ファイルをアップロードするためのStreamを取得 4 using (Stream reqStrm = ftpReq.GetRequestStream()) 5 { 6 //アップロードするファイルを開く 7 using (FileStream fs = new FileStream(upFile, FileMode.Open, FileAccess.Read)) 8 { 9 //アップロードStreamに書き込む 10 byte[] buffer = new byte[1024]; 11 while (true) 12 { 13 int readSize = fs.Read(buffer, 0, buffer.Length); 14 if (readSize == 0) 15 break; 16 reqStrm.Write(buffer, 0, readSize); 17 } 18 } 19 20 21 } 22} 23catch 24{ 25}
以下、再修正版
C#
1//ファイルをアップロードするためのStreamを取得 2using (Stream reqStrm = ftpReq.GetRequestStream()) 3{ 4//アップロードするファイルを開く 5using (FileStream fs = new FileStream(upFile, FileMode.Open, FileAccess.Read)) 6{ 7 try 8 { 9 //アップロードStreamに書き込む 10 byte[] buffer = new byte[1024]; 11 while (true) 12 { 13 int readSize = fs.Read(buffer, 0, buffer.Length); 14 if (readSize == 0) 15 break; 16 reqStrm.Write(buffer, 0, readSize); 17 } 18 } 19 catch 20 { 21 } 22} 23 24}
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/19 09:35
退会済みユーザー
2020/03/19 10:06