線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5283
推到 Plurk!
推到 Facebook!

WIN32 API 判斷有新的檔案加入

答題得分者是:pcboy
xiaolaba
一般會員


發表:10
回覆:17
積分:5
註冊:2010-05-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-05-15 13:15:35 IP:218.102.xxx.xxx 訂閱
計畫自己寫一個把傳真檔案發送到指定 EMAIL 的小工具.

以 WINDOWS 來說, 接收到的傳真, 會自動以 TIF 的格式儲存到規定的資料夾, 請問可以用哪個 WIN32 API 判斷有新的檔案加入.

構想是, 只要偵測到新檔案, 發送, 再把檔案的屬性修改, 下次再有新檔案加入, 就不會重複發送.
------
http://xiaolaba.wordpress.com
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-06-12 17:20:09 IP:114.32.xxx.xxx 訂閱
可以用 ReadDirectoryChangesW
怎麼使用請參考Win32 SDK


===================引 用 xiaolaba 文 章===================
計畫自己寫一個把傳真檔案發送到指定 EMAIL 的小工具.

以 WINDOWS 來說, 接收到的傳真, 會自動以 TIF 的格式儲存到規定的資料夾, 請問可以用哪個 WIN32 API 判斷有新的檔案加入.

構想是, 只要偵測到新檔案, 發送, 再把檔案的屬性修改, 下次再有新檔案加入, 就不會重複發送.
xiaolaba
一般會員


發表:10
回覆:17
積分:5
註冊:2010-05-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-07-20 09:11:41 IP:114.42.xxx.xxx 訂閱

===================引 用 pprayer 文 章===================
可以用 ReadDirectoryChangesW
怎麼使用請參考Win32 SDK


===================引 用 xiaolaba 文 章===================
計畫自己寫一個把傳真檔案發送到指定 EMAIL 的小工具.

以 WINDOWS 來說, 接收到的傳真, 會自動以 TIF 的格式儲存到規定的資料夾, 請問可以用哪個 WIN32 API 判斷有新的檔案加入.

構想是, 只要偵測到新檔案, 發送, 再把檔案的屬性修改, 下次再有新檔案加入, 就不會重複發送.


感謝你的提示

------
http://xiaolaba.wordpress.com
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-07-20 11:51:15 IP:210.69.xxx.xxx 訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-07-20 13:24:28 IP:114.32.xxx.xxx 訂閱

C#.....原碼都有....請問可以一併提供可執行檔嗎 ?

因為俺是業餘人士, 只有用過 WIN32ASM....

請問 C# 要花 $$ 去買 COMPLIER 嗎...

或者作者可以把這個項目放到類似 SOURCEFORGE 之類的 CODE SITE.

------
http://xiaolaba.wordpress.com
編輯記錄
xiaolaba 重新編輯於 2010-07-20 13:26:29, 註解 無‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-07-20 14:24:37 IP:210.69.xxx.xxx 訂閱
提供您 .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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-07-21 09:12:52 IP:114.32.xxx.xxx 訂閱
實在感謝版主及眾人幫助, 昨天晚上花了1個小時, 終於可以成功 COMPILE 了  C# 的原碼.

並且就預定的目標作了一些修訂, 直接把文件以附件寄EMAIL, 也成功, 但是遇到了用外的問題.

參考 C# 的提示文件, 每次寄件完畢, 使用下列語句廢止產生的 OBJECT

附件.DISPOSE();


可是每當連續收到兩份FAX件時, 就會因為前一份文件還在使用, 出現 EXCEPTION ERROR 的 BUG,
請問怎樣解決這個BUG呢 ?
------
http://xiaolaba.wordpress.com
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-07-21 12:14:40 IP:210.69.xxx.xxx 訂閱
> 可是每當連續收到兩份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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-08-01 10:41:14 IP:114.32.xxx.xxx 訂閱
感謝你的提示. 但是還是沒有辦法解決.

一條傳真線, 接收了第一份傳真, 成功以附件發出. 等待........第二份傳真進來........接收完畢, 以附件發出時就出現這個錯誤, 說第一份附件還在使用, 無法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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-08-07 13:42:58 IP:114.32.xxx.xxx 訂閱
我不太確定你的情況是否如我所想的
看描述不太像 給你當參考囉

當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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-08-03 17:08:46 IP:111.240.xxx.xxx 訂閱
後來無意中解決了, 方法時設定一個 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
系統時間:2024-04-26 22:48:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!