質問

私は私のメインのアプリケーションから完全に独立して更新プログラムを持っています。私はapp.exeのを更新するUpdate.exeを実行します。ファイルが使用中であるかどうかを確認するために、私は別のファイルに移動し、それが使用されている場合は、エラーをキャッチ。何の問題は、私は戻って、名前を変更回の出現しない場合。少なくともそれは私の計画だった...

  

メインプログラム: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に名前を変更することができ、実行されている場合でも、です。私もエラーなしでアプリケーションに続行することができます。

私は私の心のうちだと思ったので、私はこれで、他のプログラマの外観を持っていたし、彼は私が上記の言ったことを確認します。

だから、我々はトライキャッチに包まれ、これを試してみました。

  

新規のFileStreamとして暗いのReadFile(upddir& "\ app.exeの"、FileMode.Open、FileAccess.Read、FileShare.None)
  readfile.Dispose()

私はそれが、ファイルの誰かがあったことを示しているだろうと思っ少なくとも、どれもファイル共有を入れます。

それはまだエラーなし続けます。

私が使用中のファイルの名前を変更することができる理由

誰もが知っていますか? また、私が今やっている何よりもこれを行うには良い方法はありますか?

ありがとう! Eroc

役に立ちましたか?

解決

アプリケーションが実行されている他のインスタンスを持っているかどうかをチェックするために次のことを行うことができます:

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

アプリが実行されているかどうかをチェックするのがより適切な方法はどれます。

File.Move MSDNのドキュメント。これは、例外がスローされているものを詳しく説明します。あなたはそれがVistaで使用されている場合でも、exeファイルの名前を変更することが許可されています。

他のヒント

"使用" を使用して同じコード:)

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

あなたはどうする可能性は、世話人の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_ *」ファイルを探し、それが彼らの1の書き込みロックを取得できない場合は、exeファイルが使用中で、書き込みロックでそれらを開こうとします。

この情報がお役に立てば幸いです。

これは私がやってしまったものです。ネットワークスキャンは、ピア・ツー・ピアネットワーク上で動作しませんでした。これは、他のすべてのコンピュータを解決しませんでした。

いずれにせよ、ここでは、次のとおりです。

  

プライベートサブCheckFileIfFileIsInUse(文字列としてByVal thefilename)
        
お試しください             「VistaのOS上で、あなたが使用中のファイルの名前を変更することができます
            ' 『元のファイルの使用』に新しいファイル名を以下の

      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 />
     

End Subの

が、これは次の人がお役に立てば幸いです。

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
scroll top