各位先進們,不好意思小弟又來求助了。
想要達成的目標是本機的資料夾下的檔案與FTP下的檔案互相比較差異後,達成資料複製、更名等動作。
目前在本機下實作成功但轉至FTP下就迷失了方向了,請各位先進們幫忙指點一下,感恩。
程式畫面:
程式碼:
namespace File_Check_Copy_Rename
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
richTextBox2.Text = "";
List<string> ListResult = new List<string>();
ListResult = GetFtpList();
int count = 0;
foreach(string LR in ListResult)
{
count += 1;
richTextBox2.Text += count + ": " + LR + "\n";
}
}
public List<string> GetFtpList()
{
List<string> strList = new List<string>();
FtpWebRequest f = (FtpWebRequest)WebRequest.Create("ftp://localhost");
f.Method = WebRequestMethods.Ftp.ListDirectory;
f.UseBinary = true;
f.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested;
f.Credentials = new NetworkCredential("admin", "admin");
StreamReader sr = new StreamReader(f.GetResponse().GetResponseStream());
string str = sr.ReadLine();
while (str != null)
{
strList.Add(str);
str = sr.ReadLine();
}
sr.Close();
sr.Dispose();
f = null;
return strList;
}
private void button2_Click(object sender, EventArgs e)
{
richTextBox3.Text += GetDif((@"D:\test\Target"), (@"D:\test\Source"));
FileCopy((@"D:\test\Target"), (@"D:\test\Source"));
}
public string GetDif(string folder1, string folder2)
{
string diff = "", filename;
string[] fns1 = Directory.GetFiles(folder1), fns2 = Directory.GetFiles(folder2);
Hashtable ht = new Hashtable();
foreach (string fn in fns1)
{
filename = Path.GetFileName(fn);
ht[filename] = 0;//標記資料夾1和資料夾2所有文件名不一样
}
foreach (string fn in fns2)
{ //找出資料夾2不再資料夾1中存在的文件名
filename = Path.GetFileName(fn);
if (ht.ContainsKey(filename)) ht[filename] = 1;//一样
else
{
diff += fn + "\n";
}
}
List<string> difs = new List<string>(fns1);
difs.AddRange(fns2);
foreach (string fn in difs.Distinct<string>())
{
Console.WriteLine(fn);
}
foreach (string fn in ht.Keys) if (ht[fn].ToString() == "0") diff += folder1 + "\\" + fn + "\n";//得到資料夾1和資料夾2不一樣文件名
return diff;
}
public void FileCopy(string folder1, string folder2)
{
string diff = "";
string filename;
string[] fns1 = Directory.GetFiles(folder1,"*.txt"), fns2 = Directory.GetFiles(folder2, "*.txt");
int count = 0;
Hashtable ht = new Hashtable();
foreach (string fn in fns1)
{
filename = Path.GetFileName(fn);
ht[filename] = 0;//标记資料夾1和資料夾2所有文件名不一样
richTextBox1.Text += fn + "\n";
}
foreach (string fn in fns2)
{ //找出資料夾2不再資料夾1中存在的文件名
filename = Path.GetFileName(fn);
if (ht.ContainsKey(filename))
{
ht[filename] = 1;//一样
}
else
{
diff += fn + "\n";
count++;
//richTextBox3.Text += count + " : " + fn + "\n";
if (File.Exists(Path.Combine(Path.GetDirectoryName(fn), Path.ChangeExtension(Path.GetFileName(fn), "recv"))))
{
File.Copy(Path.Combine(Path.GetDirectoryName(fn), Path.ChangeExtension(Path.GetFileName(fn), "recv")), Path.Combine(folder1, Path.ChangeExtension(Path.GetFileName(fn), "recv")),true);
richTextBox3.Text += "Copy To Target" + "\n";
}
else
{
File.Copy(fn, Path.Combine(Path.GetDirectoryName(fn), Path.ChangeExtension(Path.GetFileName(fn), "recv")), true);
richTextBox3.Text += "Make--" + Path.Combine(Path.GetDirectoryName(fn), Path.ChangeExtension(Path.GetFileName(fn), "recv")) + "\n";
}
//richTextBox3.Text += Path.Combine(Path.GetDirectoryName(fn), Path.ChangeExtension(Path.GetFileName(fn), "recv")) + "\n";
}
richTextBox2.Text += fn + "\n";
}
}
private void button3_Click(object sender, EventArgs e)
{
FileCheck((@"D:\test\Target"), (@"D:\test\Source"));
}
public void FileCheck(string folder1, string folder2)
{
//string diff = "";
string filename;
string[] fns1 = Directory.GetFiles(folder1, "*.recv"), fns2 = Directory.GetFiles(folder2, "*.recv");
//int count = 0;
Hashtable ht = new Hashtable();
foreach (string fn in fns1)
{
filename = Path.GetFileName(fn);
ht[filename] = 0;//標記資料夾1和資料夾2所有文件名不一樣
//richTextBox1.Text += fn + "\n";
}
foreach (string fn in fns2)
{ //找出資料夾下2不再資料夾下1中存在的文件名
filename = Path.GetFileName(fn);
if (ht.ContainsKey(filename))
{
ht[filename] = 1;//一样
FileStream Targetfile = File.OpenRead(Path.Combine(folder1, filename));
FileStream Sourcefile = File.OpenRead(fn);
if (Targetfile.Length == Sourcefile.Length)
{
MessageBox.Show("The Same");
Sourcefile.Close();
Targetfile.Close();
File.Move(fn,Path.Combine(Path.GetDirectoryName(fn), Path.ChangeExtension(Path.GetFileName(fn), "ok")));
File.Move(Path.Combine(folder1, filename), Path.Combine(Path.Combine(folder1, Path.ChangeExtension(Path.GetFileName(Path.Combine(folder1, filename)), "txt"))));
}
else
{
MessageBox.Show("Not Same");
Sourcefile.Close();
Targetfile.Close();
File.Move(fn, Path.Combine(Path.GetDirectoryName(fn), Path.ChangeExtension(Path.GetFileName(fn), "false")));
}
}
}
}
}
}
程式流程:
1.捉出Source下所有 .txt檔案。
2.捉出Target下所有 .txt檔案。
3.輸出缺少檔案名稱。
4.Source與Target資料夾比較若Target資料夾下缺少Source資料夾裡的檔案的話。
5.Source資料夾產生Target缺少的檔案並將副檔案更名為.recv。
6.將Source資料夾下的.recv檔案COPY至Target資料夾下。
7.比對.recv檔案大小是否正確,若是:將Source資料夾下的.recv更改副檔名為.ok。若否則改成.fales
8.將Target資料夾下的.recv更改副檔名為.txt。
已上在本機實現完成,但轉成FTP後才發現,本人只可以取得到FTP的檔案LIST,但不能取得FTP的絕對路徑(EX:ftp://localhost/1.txt)。
求各位先進幫幫忙實現上方程式流程但是在FTP環境下,感恩!!