C#에서 Web 방식으로 파일을 다운로드하는 코드이다.
오래되어 기억은 가물가물하지만 구글링도하고 블로그 검색으로 찾은 걸 약간 수정한거 같기는 하다.
최근에 SSD 이상증상으로 데이터를 살리지 못한 경험도 있고 해서 블로그에 기록해둔다.
사용법 예시
사용법 예시는 전체적으로 동작되는 걸 보여주는게 아니라 이런식으로 활용할 수 있다는 것만 간략하게 기록
private void webFileDown(string mp3sub, string mp3file)
{
// 파일 다운로드
string webfilePath = string.Format("http://ipaddress/{0}/{1}", mp3folder, mp3file);
string localfilePath = Folder.MyfilePath("abcdef", mp3file);
if (webFile.WebExists(webfilePath))
{
int write = webFile.DownloadFile(webfilePath, localfilePath); // 파일 사이즈를 반환
}
else
{
MessageBox.Show("다운받을 파일이 존재하지 않습니다");
return;
}
}
코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Windows.Forms;
namespace NameSpace // 수정해서 사용 필요
{
class webFile
{
/// <summary>
/// 웹파일 다운로드
/// </summary>
/// <param name="remoteFilename">웹 서버 파일</param>
/// <param name="localFilename">PC 저장 파일</param>
/// <returns>파일 크기를 반환</returns>
public static int DownloadFile(String remoteFilename, String localFilename)
{
// Function will return the number of bytes processed to the caller. Initialize to 0 here.
int bytesProcessed = 0;
// Assign values to these objects here so that they can be referenced in the finally block
Stream remoteStream = null;
Stream localStream = null;
WebResponse response = null;
// Use a try/catch/finally block as both the WebRequest and Stream classes throw exceptions upon error
try
{
WebRequest request = WebRequest.Create(remoteFilename); // 원격 파일 다운을 위한 객체 생성
if (request != null)
{
response = request.GetResponse(); // 서버로부터 WebResponse 오브젝트 받아옴
if (response != null)
{
// Once the WebResponse object has been retrieved, get the stream object associated with the response's data
remoteStream = response.GetResponseStream();
//localStream = File.Create(localFilename); // local File 생성
localStream = new FileStream(localFilename, FileMode.OpenOrCreate, FileAccess.ReadWrite);
byte[] buffer = new byte[1024]; // 1k 버퍼 할당
int bytesRead;
// Simple do/while loop to read from stream until no bytes are returned
do
{
bytesRead = remoteStream.Read(buffer, 0, buffer.Length); // 1K 바이트씩 데이터 읽기
localStream.Write(buffer, 0, bytesRead); // PC에 데이터 저장
bytesProcessed += bytesRead; // 전체 바이트 수 체크를 위해 누적
} while (bytesRead > 0);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (response != null) response.Close(); //WebResponse객체 Close
if (remoteStream != null) remoteStream.Close();
if (localStream != null) localStream.Close();
}
return bytesProcessed; // 수신한 전체 바이트수를 리턴(파일의 크기)
}
/// <summary>
/// 웹에 파일이 존재하는지 검사하여 있으면 true 반환
/// </summary>
/// <param name="url">Web 파일 경로</param>
/// <returns></returns>
public static bool WebExists(string url)
{
bool ret = true;
if (url == null)
return false;
HttpWebResponse response = null;
try
{
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD";
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException)
{
ret = false;
}
finally
{
if (response != null)
{
response.Close();
}
}
return ret;
}
}
}
'C# > 통신' 카테고리의 다른 글
C# 과 Web (0) | 2018.03.10 |
---|---|
C# Web 접속 로그인함수 만들기(HttpClient 방식) (0) | 2016.11.14 |
C# GetAsyncDataFromWeb (0) | 2016.08.21 |
C# GetDataFromWeb 사용자 함수 (0) | 2016.08.20 |
C# comboBox 에 Text, Value 추가 및 POST, JSON (0) | 2016.08.19 |