FTPファイル更新チェック(C#/VB.NET)
2010年08月10日
FTPファイルの更新有無を確認(チェック)するサンプル(ソース/コード)です。FTPファイルの更新をいち早く知りたい時に役立つと思います。処理の流れは次の通りです。2から4はタイマーで処理しています。
1.FTPファイル(旧)読み込み
2.FTPファイル(新)読み込み
3.新旧サイズチェック
4.サイズが同じ時は全バイト比較
FTP関連情報:FTPの漢字ファイル名(VB.NET)
' -----------------------------------------------------------
' FTPファイル更新チェックのサンプル(VB.NET/VS2005)
Private strUrl As String = "ftp://xxx.xxx.com/xxx/xxx.txt"
Private oldFtp As Byte() = New Byte(-1) {}
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
' FTPファイル(旧)読み込み
oldFtp = GetFtpFile(strUrl)
' FTPファイル更新チェック開始(60秒間隔)
Timer1.Interval = 60000
Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Timer1.Tick
' FTPファイル(新)読み込み
Dim newFtp As Byte() = GetFtpFile(strUrl)
If oldFtp.Length <> newFtp.Length Then
' バイト数が違う
Timer1.Enabled = False
MessageBox.Show("FTP更新有り")
Return
Else
For i As Integer = 0 To oldFtp.Length - 1
If oldFtp(i) <> newFtp(i) Then
' データが違う
Timer1.Enabled = False
MessageBox.Show("FTP更新有り")
Return
End If
Next
End If
End Sub
' FTPファイル取得(ダウンロード)
Private Function GetFtpFile(ByVal url As String) As Byte()
Dim st As System.IO.Stream = Nothing
Dim rs As System.Net.WebResponse = Nothing
Try
Dim url_uri As New Uri(url)
Dim dat As Byte() = New Byte(-1) {}
Dim rq As System.Net.FtpWebRequest = _
CType(System.Net.FtpWebRequest.Create(url), _
System.Net.FtpWebRequest)
' ユーザIDとパスワードの設定
rq.Credentials = _
New System.Net.NetworkCredential( _
"hf524137 ", "vh2dg7G6")
' ファイルのダウンロード指定
rq.Method = _
System.Net.WebRequestMethods.Ftp.DownloadFile
' KeepAlive設定
rq.KeepAlive = False
' バイナリ設定
rq.UseBinary = True
' パッシブ設定
rq.UsePassive = False
' FTP接続
rs = rq.GetResponse()
' FTPダウンロード
st = rs.GetResponseStream()
Dim bytes As Byte()
Dim ttlSiz As Integer = 0
Dim oneSiz As Integer
Do
ReDim bytes((1024 * 100) - 1)
oneSiz = st.Read(bytes, 0, bytes.Length)
If oneSiz > 0 Then
ReDim Preserve dat(ttlSiz + oneSiz - 1)
If oneSiz <> bytes.Length Then
ReDim Preserve bytes(oneSiz - 1)
End If
bytes.CopyTo(dat, ttlSiz)
ttlSiz = ttlSiz + oneSiz
End If
Loop While (oneSiz > 0)
Return dat
Catch ex As Exception
Throw ex
Finally
If st Is Nothing = False Then
st.Close()
st = Nothing
End If
If rs Is Nothing = False Then
rs.Close()
rs = Nothing
End If
End Try
End Function
' -----------------------------------------------------------
// ----------------------------------------------------------
// FTPファイル更新チェックのサンプル(C#.NET/VS2005)
private String strUrl = "ftp://xxx.xxx.com/xxx/xxx.txt";
private Byte[] oldFtp = new Byte[0] { };
private void button1_Click(object sender, EventArgs e)
{
// FTPファイル(旧)読み込み
oldFtp = GetFtpFile(strUrl);
// FTPファイル更新チェック開始(60秒間隔)
timer1.Interval = 60000;
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
// FTPファイル(新)読み込み
Byte[] newFtp = GetFtpFile(strUrl);
if (oldFtp.Length != newFtp.Length)
{
// バイト数が違う
timer1.Enabled = false;
MessageBox.Show("FTP更新有り");
return;
}
else
{
for (int i = 0; i <= oldFtp.Length - 1; i++)
{
if (oldFtp[i] != newFtp[i])
{
// データが違う
timer1.Enabled = false;
MessageBox.Show("FTP更新有り");
return;
}
}
}
}
// FTPファイル取得(ダウンロード)
private Byte[] GetFtpFile(String url)
{
System.IO.Stream st = null;
System.Net.WebResponse rs = null;
try
{
Uri url_uri = new Uri(url);
Byte[] dat = new Byte[0] { };
System.Net.FtpWebRequest rq =
((System.Net.FtpWebRequest)
System.Net.WebRequest.Create(url));
// ユーザIDとパスワードの設定
rq.Credentials =
new System.Net.NetworkCredential(
"hf524137 ", "vh2dg7G6");
// ファイルのダウンロード指定
rq.Method =
System.Net.WebRequestMethods.Ftp.DownloadFile;
// KeepAlive設定
rq.KeepAlive = false;
// バイナリ設定
rq.UseBinary = true;
// パッシブ設定
rq.UsePassive = false;
// FTP接続
rs = rq.GetResponse();
//FTPダウンロード
st = rs.GetResponseStream();
Byte[] bytes = new Byte[0] { };
int ttlSiz = 0;
int oneSiz;
do
{
Array.Resize<Byte>(ref bytes, 1024 * 100);
oneSiz = st.Read(bytes, 0, bytes.Length);
if (oneSiz > 0)
{
Array.Resize<Byte>(ref dat, ttlSiz + oneSiz);
if (oneSiz != bytes.Length)
{
Array.Resize<Byte>(ref bytes, oneSiz);
}
bytes.CopyTo(dat, ttlSiz);
ttlSiz = ttlSiz + oneSiz;
}
} while (oneSiz > 0);
return dat;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (st != null)
{
st.Close();
st = null;
}
if (rs != null)
{
rs.Close();
rs = null;
}
}
}
// ----------------------------------------------------------