也许我已经在最后一个问题中说过了......
我有一个PHP脚本,它不断使用cronjobs更新ZIP文件。
虽然我有一个在后台运行的VB.NET应用程序,它每900毫秒执行一次。这个VB.NET应用程序使用FTP下载ZIP文件。
每次更新ZIP文件时......我得到"(550)文件不可用" VB.NET应用程序出错,但点击"继续"新文件已成功下载。
我到处搜索忽略这个错误并阻止它显示但没有任何好处。
那该怎么办?修复是在PHP代码中?还是VB.NET代码?
我已经有了一个解决方案,它将VB.NET应用程序Timer增加到5000毫秒(5秒)而不是900毫秒。但我确实看到900毫秒的时间是合适的,因为我希望快速下载文件。
编辑:增加计时器失败,因为计时器仍然可能正在运行并且cronjob在同一时间执行。
如果有任何解决方案,那真的很棒!否则,我认为唯一的解决方案是增加VB.NET应用程序Timer,对吗?
谢谢!
答案 0 :(得分:1)
是唯一的解决方案是更改定时器间隔。
在Form Load事件上写这个(Timer1是一个例子,但你写了你的计时器名称):
Timer1.Interval = 5000
但是,如果您正在使用C#,您可以检查FTP服务器上是否存在该文件.....如果该文件不存在,则计时器将不会执行!但你使用的是vb dot net
答案 1 :(得分:1)
争用共享资源的任何两个周期性任务最终都会遇到冲突。处理它的一般策略是:
在成功之前重试失败的操作
锁定资源,使得呼叫者被阻止,直到锁被释放为止
在您的情况下,重试似乎更容易,因为您可以在客户端(您的VB应用程序)中实现它。锁定必须在服务器上实现,还需要配置或自定义FTP服务器本身,而不仅仅是PHP脚本。
增加计时器只会降低碰撞的风险。它并没有消除它。
答案 2 :(得分:0)
您可以将代码放入Try ... Catch中,然后忽略该错误。
答案 3 :(得分:0)
在PHP文件中,我添加了这个变量行:
$RandomFileName = rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9).".zip";
我创建了一个空的txt文件并将其命名为#34; lastfilename.txt"我将它的权限设置为777。
之后我在PHP文件中添加了它:
// Clear the content of the "lastfilename.html" file.
file_put_contents("./lastfilename.txt", "");
// Add the new content to the "lastfilename.html" file.
file_put_contents("./lastfilename.txt", $RandomFileName);
现在我在PHP文件中添加了它:
$GetLastUpdatedFileName = file_get_contents("./lastfilename.txt");
Zip('../MyFolder', '../zipfiles/'.$GetLastUpdatedFileName);
请注意我的PHP脚本ZIPs" MyFolder"目录并将ZIP文件放入" zipfiles" 。目录
我使用this answer作为Zip
函数。
现在在VB.NET应用程序中:我创建了一个Label并将其命名为#34; LastupdatedFilename" (我将Label颜色设置为Form背景的相同颜色以隐藏它)
我在VB.NET应用程序Timer tick上添加了这段代码:
Dim address As String = "http://tld.com/link/to/textfile.txt"
Dim client As WebClient = New WebClient()
Dim reader As StreamReader = New StreamReader(client.OpenRead(address))
LastupdatedFilename.Text = reader.ReadToEnd
现在VB.NET应用程序按如下方式下载文件(这也在Timer tick代码中添加):
FtpDownloadFile("htdocs/zipfiles/" + LastupdatedFilename.Text)
所以是的,它浪费了磁盘空间,但它适合我。
摘要 :我使用新名称创建新的ZIP文件,而不是替换旧的。
感谢所有试图解决我问题的人: - )