-->

VB.Net 3.5检查文件正在使用(VB.Net 3.5 Check if file is in

2019-06-24 22:18发布

我有一个更新程序是完全独立的我的主要应用。 我运行Update.exe更新APP.EXE。 要检查是否该文件正在使用中,我把它移动到另一个文件,并赶上一个错误,如果它是在使用中。 如果没有问题occurr我将其重命名。 至少这是我的计划......

主程序:APP.EXE
更新程序:Update.exe的

该程序用于在网络上不运行任何服务。 因此,用户在毫不夸张地跑过来thier机上的网络exe文件。

我需要的Update.exe已运行时更新APP.EXE。 要检查,看看是否APP.EXE仍在使用我的包裹在以下一个try / catch,看它是否失败:

IO.File.Move(upddir& “\ APP.EXE”,upddir& “\ app.exe.tst”)
IO.File.Move(upddir& “\ app.exe.tst”,upddir& “\ APP.EXE”)

有趣的是,即使APP.EXE运行,此举可以将其重命名为app.exe.tst没有任何错误。 我甚至可以继续在没有任何错误的应用程序。

我以为我是在我心里,让我不得不另一个程序员看看这个,他证实了我上面说的。

因此,我们尝试这种包装在一个尝试捕捉:

暗淡的ReadFile作为新的FileStream(upddir& “\ APP.EXE”,FileMode.Open,FileAccess.Read,FileShare.None)
readfile.Dispose()

我把文件共享作为没有,至少我认为它会,表明有一个人在文件中。

它仍然继续进行,没有任何错误。

任何人都知道为什么我可以重命名使用中的文件? 此外,有没有更好的方法来做到这一点比什么,我现在在做什么?

谢谢! Eroc

Answer 1:

你可以做到以下几点来检查应用程序运行的其他实例:

Process.GetProcessesByName("app.exe", "Machine1").Length > 0

这是,如果应用程序正在运行中的检查更合适的方式。

看看File.Move MSDN文档。 它详细介绍了抛出异常的东西。 你被允许重新命名,即使它是在使用Vista中的exe文件。



Answer 2:

相同的代码使用“使用” :)

Public Function FileInUse(ByVal sFile As String) As Boolean
 Dim thisFileInUse As Boolean = False
 If System.IO.File.Exists(sFile) Then
     Try
       Using f As New IO.FileStream(sFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
                ' thisFileInUse = False
       End Using
     Catch
       thisFileInUse = True
     End Try
 End If
 Return thisFileInUse
End Function


Answer 3:

你可以做的是更换一个看守政府EXE目标应用程序。

这看守政府则衍生为目标应用,而且还创造了一个共享位置锁定的文件。 锁被释放,该文件被删除,应用程序退出时。

然后,您更新APP.EXE之前,你检查是否有共享位置的任何锁定的文件,如果有锁定的文件,则APP.EXE正在使用中。

该看守程序可能是一个窗口应用较少,下面的控制台应用程序,并几乎什么需要做的

class Program
{
    static string lockFileName;
    static System.IO.StreamWriter lockFileWrtier;
    static void Main(string[] args)
    {
        lockFileName = "AppLock_" + System.IO.Path.GetRandomFileName();

        lockFileWrtier = new System.IO.StreamWriter(lockFileName);

        System.Diagnostics.Process p = new Process();
        p.StartInfo.FileName = "cmd.exe";
        p.EnableRaisingEvents = true;
        p.Exited += new EventHandler(p_Exited);

        p.Start();

        Console.WriteLine("Press any key to stop");
        Console.ReadKey();
    }

    static void p_Exited(object sender, EventArgs e)
    {
        lockFileWrtier.Dispose();
        System.IO.File.Delete(lockFileName);

        Console.WriteLine("Process has exited");
    }
}

然后更新查找所有“AppLock_ *”的文件,并试图用写锁打开它们,如果不能得到他们中的一个写锁,exe文件正在使用中。

希望这可以帮助。



Answer 4:

这是我落得这样做。 网络扫描没有一个对等网络上工作。 它根本不解决其他计算机。

总之,在这里它是:

私人小组CheckFileIfFileIsInUse(BYVAL thefilename作为字符串)
尝试
“由于Vista操作系统,你可以重命名文件正在使用
“的‘原始文件的使用’紧跟在新的文件名

  Dim testfile As String = thefilename & ".tst"<br /> If IO.File.Exists(testfile) Then<br /> IO.File.Delete(testfile)<br /> End If<br /> ' so we have to rename it to something else<br /> IO.File.Move(thefilename, testfile)<br /> ' copy it back to the original file name in case something <br />breaks ' this just keeps them in working order if it does<br /> IO.File.Copy(testfile, thefilename)<br /> ' then we try to delete the original file that could be in use <br /> ' which will return an 'in use' error at this point<br /> If IO.File.Exists(testfile) Then<br /> IO.File.Delete(testfile)<br /> End If<br /> Catch ex As Exception<br /> 'throw it to the originating method<br /> Throw<br /> End Try<br /> 

结束小组

希望这有助于下一个人。



Answer 5:

Public Function FileInUse(ByVal sFile As String) As Boolean
    If System.IO.File.Exists(sFile) Then
        Try
            Dim F As Short = FreeFile()
            FileOpen(F, sFile, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.LockReadWrite)
            FileClose(F)
        Catch
            Return True
        End Try
    End If
End Function


文章来源: VB.Net 3.5 Check if file is in use