WIN32 API 判斷有新的檔案加入 |
答題得分者是:pcboy
|
xiaolaba
一般會員 發表:10 回覆:17 積分:5 註冊:2010-05-15 發送簡訊給我 |
|
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
可以用 ReadDirectoryChangesW
怎麼使用請參考Win32 SDK ===================引 用 xiaolaba 文 章=================== 計畫自己寫一個把傳真檔案發送到指定 EMAIL 的小工具. 以 WINDOWS 來說, 接收到的傳真, 會自動以 TIF 的格式儲存到規定的資料夾, 請問可以用哪個 WIN32 API 判斷有新的檔案加入. 構想是, 只要偵測到新檔案, 發送, 再把檔案的屬性修改, 下次再有新檔案加入, 就不會重複發送. |
xiaolaba
一般會員 發表:10 回覆:17 積分:5 註冊:2010-05-15 發送簡訊給我 |
===================引 用 pprayer 文 章=================== 可以用 ReadDirectoryChangesW 怎麼使用請參考Win32 SDK ===================引 用 xiaolaba 文 章=================== 計畫自己寫一個把傳真檔案發送到指定 EMAIL 的小工具. 以 WINDOWS 來說, 接收到的傳真, 會自動以 TIF 的格式儲存到規定的資料夾, 請問可以用哪個 WIN32 API 判斷有新的檔案加入. 構想是, 只要偵測到新檔案, 發送, 再把檔案的屬性修改, 下次再有新檔案加入, 就不會重複發送. 感謝你的提示
------
http://xiaolaba.wordpress.com |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
Visual Studio C# 2008 的 fileSystemWatcher1 控制項 蠻方便的
(雖然不是 Delphi Code) [code c#] using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; // fileSystemWatcher1 using System.Net.Mail; // MailMessage namespace System_FileSystemWatcher { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // Form 上請放一個 fileSystemWatcher 元件 fileSystemWatcher1.Path = "D:\\input\\"; //FileWatcher.Filter = "*.txt"; fileSystemWatcher1.Filter = "*.*"; fileSystemWatcher1.IncludeSubdirectories = true; //fileSystemWatcher1.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; fileSystemWatcher1.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName ; fileSystemWatcher1.Deleted = new FileSystemEventHandler(this.FileWatcher_Deleted); fileSystemWatcher1.Renamed = new RenamedEventHandler(this.FileWatcher_Renamed); fileSystemWatcher1.Created = new FileSystemEventHandler(this.FileWatcher_Created); fileSystemWatcher1.Changed = new FileSystemEventHandler(this.FileWatcher_Changed); } private void FileWatcher_Created(object sender, System.IO.FileSystemEventArgs e) { //MessageBox.Show(string.Format("新增一個{0}檔案",e.Name), this.Text); //listBox1.Items.Add(string.Format("新增一個{0}檔案", e.Name)); //if ((e.Name.IndexOf("xml\\") == -1) && (e.Name.IndexOf(".xml") == -1)) //if (e.Name.IndexOf("xml\\") == -1) if (e.Name.IndexOf("xml") == -1) { listBox1.Items.Add(string.Format("新增一個{0}檔案", e.Name)); SendMailUseGmail(e.Name); } } private void FileWatcher_Deleted(object sender, System.IO.FileSystemEventArgs e) { //MessageBox.Show(string.Format("刪除一個{0}檔案",e.Name), this.Text); //listBox1.Items.Add(string.Format("刪除一個{0}檔案", e.Name)); //if ((e.Name.IndexOf("xml\\") == -1) && (e.Name.IndexOf(".xml") == -1)) //if (e.Name.IndexOf("xml\\") == -1) if (e.Name.IndexOf("xml") == -1) { listBox1.Items.Add(string.Format("刪除一個{0}檔案", e.Name)); SendMailUseGmail(e.Name); } } private void FileWatcher_Renamed(object sender, System.IO.RenamedEventArgs e) { //MessageBox.Show(string.Format("檔案{0}被改名為{1}",e.OldFullPath,e.FullPath), this.Text); //listBox1.Items.Add(string.Format("改名一個{0}檔案", e.Name)); //if ((e.Name.IndexOf("xml\\") == -1) && (e.Name.IndexOf(".xml") == -1)) //if (e.Name.IndexOf("xml\\") == -1) if (e.Name.IndexOf("xml") == -1) { listBox1.Items.Add(string.Format("改名一個{0}檔案", e.Name)); SendMailUseGmail(e.Name); } } private void FileWatcher_Changed(object sender, System.IO.FileSystemEventArgs e) { //MessageBox.Show(string.Format("檔案{0}被改名為{1}",e.OldFullPath,e.FullPath), this.Text); //listBox1.Items.Add(string.Format("更新一個{0}檔案", e.Name)); //if ((e.Name.IndexOf("xml\\") == -1) && (e.Name.IndexOf(".xml") == -1)) //if (e.Name.IndexOf("xml\\") == -1) if (e.Name.IndexOf("xml") == -1) { listBox1.Items.Add(string.Format("更新一個{0}檔案", e.Name)); SendMailUseGmail(e.Name); } } public void SendMailUseGmail(string eName) { System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(); msg.To.Add("abc@def.com.tw"); //msg.To.Add("b@b.com"); /* * msg.To.Add("b@b.com"); * msg.To.Add("b@b.com"); * msg.To.Add("b@b.com"); */ //msg.CC.Add("c@c.com"); /* * msg.CC.Add("c@c.com"); * msg.CC.Add("c@c.com"); */ msg.From = new MailAddress("kkk@gmail.com", "kkk@gmail.com", System.Text.Encoding.UTF8); msg.Subject = "目錄中檔案發生異動" eName; msg.SubjectEncoding = System.Text.Encoding.UTF8; msg.Body = "請檢查主機的 d:/input/" eName; msg.BodyEncoding = System.Text.Encoding.UTF8; msg.IsBodyHtml = false; msg.Priority = MailPriority.High; SmtpClient client = new SmtpClient(); client.Credentials = new System.Net.NetworkCredential("kkk@gmail.com", "Email的密碼"); //client.Port = 587;//Gmail Port, Success //client.Port = 465;//Gmail Port, Failed client.Port = 25;//Gmail Port, Success client.Host = "smtp.gmail.com"; client.EnableSsl = true; // by SSL object userState = msg; try { // SendAsync Failed //client.SendAsync(msg, userState); client.Send(msg); //MessageBox.Show("Send OK"); label1.Text = "Send Ok"; } catch (System.Net.Mail.SmtpException ex) { //MessageBox.Show(ex.Message, "Failed"); label1.Text = ex.Message; } } } } [/code]
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2010-07-20 11:52:40, 註解 無‧
|
xiaolaba
一般會員 發表:10 回覆:17 積分:5 註冊:2010-05-15 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
提供您 .exe 可執行檔案沒用,您要照您的需求修改
監控的目錄是寫死在程式中 (目前是 D:\input ) 寄通知信那段程式碼,用不上可以拿掉,不然就改寫成自己的 email 和密碼 軟體可以到下面下載 Microsoft Visual Studio 2008 Express with Service Pack 1繁體中文版 (免費) http://www.microsoft.com/downloads/details.aspx?displaylang=zh-tw&FamilyID=3254c868-bcb9-412c-95c6-d100c872ec60 Visual Studio 2010 繁體中文試用版(90天) http://www.microsoft.com/visualstudio/zh-tw/download
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
xiaolaba
一般會員 發表:10 回覆:17 積分:5 註冊:2010-05-15 發送簡訊給我 |
實在感謝版主及眾人幫助, 昨天晚上花了1個小時, 終於可以成功 COMPILE 了 C# 的原碼.
並且就預定的目標作了一些修訂, 直接把文件以附件寄EMAIL, 也成功, 但是遇到了用外的問題. 參考 C# 的提示文件, 每次寄件完畢, 使用下列語句廢止產生的 OBJECT 附件.DISPOSE(); 可是每當連續收到兩份FAX件時, 就會因為前一份文件還在使用, 出現 EXCEPTION ERROR 的 BUG, 請問怎樣解決這個BUG呢 ?
------
http://xiaolaba.wordpress.com |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
> 可是每當連續收到兩份FAX件時, 就會因為前一份文件還在使用, 出現 EXCEPTION ERROR 的 BUG,
> 請問怎樣解決這個 BUG呢 ? 不懂 你是一條電話線在接收傳真 ? 還是多條 ? 前一份文件誰在使用 ? Exception error 是例外錯誤,也就是預期以外的錯誤 一般要用 try catch 捕捉 exception,檢查 exception 的錯誤訊息,才會知道發生甚麼事情 [code c#] try { // 懷疑可能產生 Exception 的程式碼 int a = 0; int b = 1 / a; } catch (Exception ex) { label1.Text = ex.Message.ToString(); } [/code]
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
xiaolaba
一般會員 發表:10 回覆:17 積分:5 註冊:2010-05-15 發送簡訊給我 |
感謝你的提示. 但是還是沒有辦法解決.
一條傳真線, 接收了第一份傳真, 成功以附件發出. 等待........第二份傳真進來........接收完畢, 以附件發出時就出現這個錯誤, 說第一份附件還在使用, 無法ACCESS. ===================引 用 pcboy 文 章=================== > 可是每當連續收到兩份FAX件時, 就會因為前一份文件還在使用, 出現 EXCEPTION ERROR 的 BUG, > 請問怎樣解決這個 BUG呢 ? 不懂 你是一條電話線在接收傳真 ? 還是多條 ? 前一份文件誰在使用 ? Exception error 是例外錯誤,也就是預期以外的錯誤 一般要用 try catch 捕捉 exception,檢查 exception 的錯誤訊息,才會知道發生甚麼事情 [code c#] try { // 懷疑可能產生 Exception 的程式碼 int a = 0; int b = 1 / a; } catch (Exception ex) { label1.Text = ex.Message.ToString(); } [/code]
------
http://xiaolaba.wordpress.com |
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
我不太確定你的情況是否如我所想的
看描述不太像 給你當參考囉 當FAX-IN 時,照程式的行為會Create 一個TIFF檔 此時元件的Event會被觸發 一面收DATA一面加到那個被Create的檔案中 直到所有的DATA都收到了 檔案才不再是被存取的狀態 也就是收到傳真的瞬間與收完傳真是兩個時間點,會有時間差 這段時間差之中,檔案不能被另外的process存取 或者你Mail的元件會一直等待 直到TIFF檔可以存取才加入到附件發送 也因此重複Create Mail用的元件會有記憶體錯誤的疑慮 如果是這樣的話 可以在TIFF檔產生後一直觀察該檔案的File Size 直到File Size不再變動後 才去使用它 ===================引 用 xiaolaba 文 章=================== 感謝你的提示. 但是還是沒有辦法解決. 一條傳真線, 接收了第一份傳真, 成功以附件發出. 等待........第二份傳真進來........接收完畢, 以附件發出時就出現這個錯誤, 說第一份附件還在使用, 無法ACCESS. |
xiaolaba
一般會員 發表:10 回覆:17 積分:5 註冊:2010-05-15 發送簡訊給我 |
後來無意中解決了, 方法時設定一個 TIMER, 等5秒.
因為假設, 5秒內不會有另一份FAX, 所以就好了. 如果真的5秒內有另一份FAX, 還沒試過, 真有問題就無能為力, 畢竟能用就好, 不是賣錢的. 謝謝你喔 ===================引 用 pprayer 文 章=================== 我不太確定你的情況是否如我所想的 看描述不太像 給你當參考囉 當FAX-IN 時,照程式的行為會Create 一個TIFF檔 此時元件的Event會被觸發 一面收DATA一面加到那個被Create的檔案中 直到所有的DATA都收到了 檔案才不再是被存取的狀態 也就是收到傳真的瞬間與收完傳真是兩個時間點,會有時間差 這段時間差之中,檔案不能被另外的process存取 或者你Mail的元件會一直等待 直到TIFF檔可以存取才加入到附件發送 也因此重複Create Mail用的元件會有記憶體錯誤的疑慮 如果是這樣的話 可以在TIFF檔產生後一直觀察該檔案的File Size 直到File Size不再變動後 才去使用它 ===================引 用 xiaolaba 文 章=================== 感謝你的提示. 但是還是沒有辦法解決. 一條傳真線, 接收了第一份傳真, 成功以附件發出. 等待........第二份傳真進來........接收完畢, 以附件發出時就出現這個錯誤, 說第一份附件還在使用, 無法ACCESS.
------
http://xiaolaba.wordpress.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |