2009-06-09 6 views
3

が問題だ、私は(接続....何とか何とか)を使用して接続を使用して、私は開始したいかけて、私はブロックを使用した後でこのようaplicationエクセル:System.Diagnostics.Process.Start(excelFile)。チェックし、それは

時には、コンピュータが速すぎて、ファイルが完全に閉じる前に、または接続が完全に終了する前に、上記の文がエキスパートされ、開くことができないファイルにアクセスします。

これは私がそれを一時停止した場合、それはより頻繁に動作し、オンとオフが起こるが、私は私がそれにアクセスする前に、ファイルにアクセスできるようにするつもりかどうかを確認する方法が必要です。

これには例外をキャッチすると、私が試したオプション

はありませんが、例外をスローしません:働いている

connection.Close(); 
connection.Dispose(); 
GC.Collect(); 

たなしの。

は、私がどのチェックが最もlikleyファイルが利用可能であり、オープンなステートメントが誰かによって使用されているファイルをexicuedすることができます前に、その後、罰金thatsのことを返すのpossabilityを持っていることがわかっています。チェックするだけの方法が必要です。

私はこの試みたOK:

Microsoft.Office.Interop.Excel.Application _app = 
          new Microsoft.Office.Interop.Excel.Application(); 

     try 
     { 
      Workbook wbook = _app.Workbooks.Open(excelFile, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
     } 
     catch (COMException ex) 
     { 
      //The file can't be opened in Excel 
     } 
     finally 
     { 
      //close the workbook and release the resources (GC.Collect() et al as usual) 
      _app.Workbooks.Close(); 
      GC.Collect(); 

     } 
     System.Diagnostics.Process.Start(excelFile); 

を、私はキャッチを通じて例外を行くと、私は仮定していExcelが、それは

+0

私の答えはこちらをご覧ください:http://stackoverflow.com/questions/11240058/check-to-see-if-excel-is-open-from-another-office-2010-app/18715218#18715218 –

答えて

0

「『fileNameに』にアクセスすることはできません」と言われます起動コマンドに移行ファイルに書き込むときに、ファイルサイズをかなり簡単に得ることができます。あなたは2つを比較しようとしましたか?

while (fileSize != new FileInfo(excelFile).Length) { 
    Thread.Sleep(1000); 
} 
System.Diagnostics.Process.Start(excelFile); 

ファイルが正しく書き込まれないと永久にスリープ状態にならないように、カウンタを置くことができます。これがうまくいくかどうかはわかりませんが、それは価値があると思います。

+0

私はそれが何をするか分からない。あなたは、ファイルが同じサイズであればファイルで終わると言っていますか?私はそれが確かではないと思っても、私はこれがそれを確認するかどうか分からない。どのようにファイルサイズを知っていますか? –

+0

これは、そのデータが取得しやすいという前提の下にありました。私はファイルをどのように作成しているのか分かりません。そうでなければ、これを無視することができます。 –

0

ファイルはExcelで開くことが有効であるかどうかを確認するためのオプションを使用することですPrimary Interop Assemblies

Microsoft.Office.Interop.Excel.Application _app = 
           new Microsoft.Office.Interop.Excel.Application(); 

try { 
    Workbook wbook = _app.Workbooks.Open(excelFile, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
} catch (COMException ex) { 
    //The file can't be opened in Excel 
} finally { 
    //close the workbook and release the resources (GC.Collect() et al as usual) 
} 

//The file can be opened in Excel if there wasn't a caught exception. 
//You can wrap the above in a loop to test more than once as per the other answer 

しかし、いずれにせよ、それはあなたの読書にあなたの文章を同期させるための良い方法を見つけることがまだ良いです。たぶんコードを書いている部分と共有すれば、より良い提案を得ることができます。

+0

大変!いいですね、だからどこで私はSystem.Diagnostics.Process.Start(excelFile)をexicuteだろうか? ?最終ブロックに ? –

+0

Interopアセンブリを介して使用されるすべてのリソースをfinallyブロックで解放し、_appおよびブックを閉じてGCのラウンドを渡す必要があります。最後に、新しいプロセスを開始することができます。 –

+0

私は、アプリケーションとgc.collectを閉じて、ファイルを開始しようとしました。上記のように、これは動作しませんでした –

0

解決策1: あなただけ開きたいファイルの

File.Move(sourceFilename, destinationFilename) 

を試みることができます。 例外がない場合は、単に元のソースにファイルを移動します。

この解決策の欠点は、ファイルが他のプロセスによって読み込まれている場合、それはまた、例外をスローすることになります。

解決方法2:ファイルが書き込み可能である場合

FileStream stream = File.OpenWrite("yourfilename"); 
    stream.Close(); 

これはのみチェックする必要があります。

これらのソリューションでは、Excelに依存関係を追加する必要はなく、すべてのファイルタイプに対して機能します。

4

ファイルがまだ開いているかどうかを確認するために、この機能を試してみてください:

public bool IsFileOpen(string path) 
{ 
    FileStream fs = null; 
    try 
    { 
     fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None); 
     return false; 
    } 
    catch(IOException ex) 
    { 
     return true; 
    } 
    finally 
    { 
     if (fs != null) 
      fs.Close(); 
    } 
} 
0

あなたは、ファイルの変更を含むファイルシステムイベントのためにサブスクライブするFileSystemWatcherクラスを使用することができます。

変更イベントが発生したときは、ファイルを開いても安全だと思います。ただし、ファイルが他のプロセスによってすぐに再びロックされたかどうかの追加のチェックは、やってみる価値があります。

関連する問題