C# 未检测到使用 PHP 编辑的文本文件
C# doesn't detect text file that was edited with PHP
我在 Linux 服务器上有一个 PHP 网站。我在网站上的 phone 数字旁边做了一个按钮,用该数字在服务器上写入一个文本文件。以下代码有效。
$file = './gebruikers/'.$naam.'/nummer.txt';
$write = $_POST['num'];
file_put_contents($file, $write);
现在我用 TAPI3 创建了一个 C# 应用程序来调用该文本文件中的号码。
我使用 FileSystemWatcher(监视程序)来检查 php 保存文本文件的文件夹,以便在每次文件更新时进行调用。
以下代码检查选择了哪个用户,以便监视该用户的文件夹中的文本文件。
private void cbGebruikers_SelectedIndexChanged(object sender, EventArgs e)
{
if(cbGebruikers.Text != "")
{
comboBox1.Enabled = true;
button6.Enabled = true;
lblGebruiker.Visible = false;
lblTelefoon.Visible = true;
}
path = @"\192.168.1.9\SB Alarm programma\web-sb\gebruikers\" + cbGebruikers.Text;
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
lbltest.Text = watcher.Path.ToString();
}
当文本文件发生变化时,将执行以下代码。
private void OnChanged(object sender, FileSystemEventArgs e)
{
try
{
watcher.EnableRaisingEvents = false;
telnummer = File.ReadAllText(path + "/nummer.txt");
nummer = "0" + telnummer;
this.Invoke((MethodInvoker)delegate
{
txtNummer.Text = nummer;
MakeCall(nummer);
});
}
finally
{
watcher.EnableRaisingEvents = true;
}
}
如果我在我的 PC 上或另一台有权访问应用程序调用的文件夹的 PC 上更改文件夹中的文本文件,则此代码有效。
但是,如果 PHP 更改文本文件,则不会发生任何事情,但最后修改日期会更新。
有人对此有经验吗?
你能试试把NotifyFilter
改成NotifyFilters.LastWrite
吗?或者,如果您想同时监控两者,请更改为 NotifyFilters.LastWrite | NotifyFilters.LastAccess
.
此外,如果文件是由 PHP 创建的,您可能需要向 watcher.Created
添加事件处理程序。
这看起来像是在跨平台架构中使用 FileSystemWatcher 的问题。 FileSystemWatcher 通过打开到远程服务器的连接来工作,远程服务器的职责是在指定文件发生更改时做出响应。 Windows 平台使用 Win32 ReadDirectoryChanges(),而 Linux 框使用 Inotify API。因为两个 API 之间没有接口,所以 Linux 框无法响应 FileSystemWatcher。
相关链接
http://msdn.microsoft.com/en-us/library/aa365465.aspx
http://www.mono-project.com/docs/faq/technical/
我在 Linux 服务器上有一个 PHP 网站。我在网站上的 phone 数字旁边做了一个按钮,用该数字在服务器上写入一个文本文件。以下代码有效。
$file = './gebruikers/'.$naam.'/nummer.txt';
$write = $_POST['num'];
file_put_contents($file, $write);
现在我用 TAPI3 创建了一个 C# 应用程序来调用该文本文件中的号码。 我使用 FileSystemWatcher(监视程序)来检查 php 保存文本文件的文件夹,以便在每次文件更新时进行调用。
以下代码检查选择了哪个用户,以便监视该用户的文件夹中的文本文件。
private void cbGebruikers_SelectedIndexChanged(object sender, EventArgs e)
{
if(cbGebruikers.Text != "")
{
comboBox1.Enabled = true;
button6.Enabled = true;
lblGebruiker.Visible = false;
lblTelefoon.Visible = true;
}
path = @"\192.168.1.9\SB Alarm programma\web-sb\gebruikers\" + cbGebruikers.Text;
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
lbltest.Text = watcher.Path.ToString();
}
当文本文件发生变化时,将执行以下代码。
private void OnChanged(object sender, FileSystemEventArgs e)
{
try
{
watcher.EnableRaisingEvents = false;
telnummer = File.ReadAllText(path + "/nummer.txt");
nummer = "0" + telnummer;
this.Invoke((MethodInvoker)delegate
{
txtNummer.Text = nummer;
MakeCall(nummer);
});
}
finally
{
watcher.EnableRaisingEvents = true;
}
}
如果我在我的 PC 上或另一台有权访问应用程序调用的文件夹的 PC 上更改文件夹中的文本文件,则此代码有效。 但是,如果 PHP 更改文本文件,则不会发生任何事情,但最后修改日期会更新。
有人对此有经验吗?
你能试试把NotifyFilter
改成NotifyFilters.LastWrite
吗?或者,如果您想同时监控两者,请更改为 NotifyFilters.LastWrite | NotifyFilters.LastAccess
.
此外,如果文件是由 PHP 创建的,您可能需要向 watcher.Created
添加事件处理程序。
这看起来像是在跨平台架构中使用 FileSystemWatcher 的问题。 FileSystemWatcher 通过打开到远程服务器的连接来工作,远程服务器的职责是在指定文件发生更改时做出响应。 Windows 平台使用 Win32 ReadDirectoryChanges(),而 Linux 框使用 Inotify API。因为两个 API 之间没有接口,所以 Linux 框无法响应 FileSystemWatcher。
相关链接 http://msdn.microsoft.com/en-us/library/aa365465.aspx http://www.mono-project.com/docs/faq/technical/