2013-11-04 94 views
1

在下面的代码中,我试图检查一个Excel文件是否打开, 如果是那么我想关闭它,当我运行代码时,文件确实是 没有关闭,你能帮忙吗?关闭一个Excel文件,如果发现它已经打开

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 
using Microsoft.Office.Interop.Excel; 
using Excel = Microsoft.Office.Interop.Excel; 

namespace CloseIfFileOpen 
{ 
    class Program 
    { 
     public static void Main() 
     { 
      Excel.Application oApp; 
      Excel.Workbook oBook; 

      oApp = new Excel.Application(); 

      oBook =oApp.Workbooks.Add(@"C:\Users\user\Documents\WEF\Excel\Example.xlsx"); 


      string filePath; 

      filePath = @"C:\Users\user\Documents\WEF\Excel\Example.xlsx"; 


      try 
      { 
       using (File.Open(filePath, FileMode.Open)) { } 
      } 
      catch (IOException e) 
      { 
       var errorCode = Marshal.GetHRForException(e) & ((1 << 16) - 1); 

       //return errorCode == 32 || errorCode == 33; 
       MessageBox.Show("the file is unavailable now"); 

       oBook.Save(); 
       oBook.Close(); 
       oApp.Quit(); 
      } 
     } 
    } 
} 
+0

我想帮忙,但是你的代码是不可读的。命名是可怕的,没有评论,和混乱。 – Noctis

回答

0

我用这个方法来检查,如果我可以,如果是打开一个文件,那么这样做,如果没有的话就不要 设置到Excel工作表的路径

的paramater路径
private Microsoft.Office.Interop.Excel.Application appExcel; 
    private Workbook newWorkbook = null; 
    private _Worksheet objsheet = null; 

    public void excel_init(String path) 
    { 
     appExcel = new Microsoft.Office.Interop.Excel.Application(); 

     if (System.IO.File.Exists(path)) 
     { 
      // then go and load this into excel 
      newWorkbook = appExcel.Workbooks.Open(path, true, true); 
      objsheet = (_Worksheet)appExcel.ActiveWorkbook.ActiveSheet; 
     } 
     else 
     { 
      Console.WriteLine("Unable to open workbook"); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel); 
      appExcel = null; 
     } 

    } 
1

我是否正确地假设你想检查文件是否被另一个进程使用,如果是,关闭它?因为我认为在windows中没有办法做到这一点,所以只能关闭自己对文件的使用。可能有办法通过使用Win32 API强制解锁文件,但是没有任何内容可以构建到C#中。调用关闭文件只会关闭您自己对文件的使用,不会影响其他进程。

+0

可以杀死C#中的特定进程: 尝试 { \t的foreach(过程PROC在Process.GetProcessesByName( “utorrent的”)) { proc.Kill(); } } catch(Exception ex) { \t MessageBox.Show(ex.Message); } – Baklap4

+0

当然,但是这会迫使你杀死实际的违规进程而不是强制它释放文件。它还假定你知道哪个违规流程是。 – Tobberoth

+0

是的,如果文件打开,我想关闭它。 –

0

你不是说你想独占访问该文件。似乎不太可能,但是可能Excel不会锁定文件,以便其他进程可以在读取模式下打开文件。也许你的文件开行应该是:

using (File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None)) { }

0

此代码,可以肯定,将帮助您检查两个文件是打开或不 (我检查Excel文件的代码)

private bool check_file_oppen(string check) 
    {//where string check is the path of required file 

     try 
     { 
      Stream s = File.Open(check, FileMode.Open, FileAccess.Read, FileShare.None); 
      s.Close(); 
      MessageBox.Show("FILE IS NOT OPEN"); 
      return true; 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("FILE IS OPEN"); 

      return false; 
     } 
    } 

现在,“如果这个excel文件是开放的,那么如何关闭它?”是我仍在寻找的问题,............

如果你找到答案,请与我分享,...............

谢谢。

ARK。

0
 foreach (var process in Process.GetProcessesByName("EXCEL")) 
     { 
      process.Kill(); 
     } 
相关问题