2011-07-20 43 views
1

我正在开发ac#应用程序,后端为sqlite。在我的应用程序中,我有一个用于清理databse的选项。它意味着curren.db文件将使用File.Delete方法删除,并再次创建使用File.create方法清空数据库。现在让我解释一下这个问题。文件正在被其他进程使用

要执行cleandatabse任务,我必须停止正在运行的所有进程,这样做后,如果我点击干净的数据库它是抛出一个错误,该文件无法删除,它正在被另一个process.i使用停止正在运行的所有线程。

不知怎的,我能够找到哪个进程blocikng文件,

foreach (var process in Process.GetProcesses()) { 
       var files = GetFilesLockedBy(process); 
       if (files.Contains(filePath)) 
       { 
        procs.Add(process); 
        Console.WriteLine(process.ProcessName); 
        process.Kill(); 
        File.Delete(filePath); 
       } 
      } 

但在上面的代码中,我用process.Kill,其中关闭,我正在运行的窗口形式。 没有使用杀,我试图关闭和处置哪些不适合我。

你能帮我从流程中释放文件而不关闭应用程序,然后你删除数据库文件。

预先感谢您

问候

桑吉塔。

+1

@ user703526 - 为什么不简单地删除数据库的内容而不是数据库文件本身。 –

回答

3

你应该确保你封闭每个流你打开它:

using (Stream str = File.Create("C:\\h.txt")) 
{ 
// your code here 
} // the stream will be automatically closed here 

,如果你不把这个using声明,它会导致你很多的bug,即使你手动关闭它str.Close();

0

不确定,但您可能正在调用当前进程的Kill。 编辑:循环后调用Delte。 试试这个:

int currentProcessId = Process.GetCurrentProcess().Id; 
foreach (var process in Process.GetProcesses()) { 
       if (process.Id != currentProcessId) 
       { 
       var files = GetFilesLockedBy(process); 
       if (files.Contains(filePath)) 
       { 
        procs.Add(process); 
        Console.WriteLine(process.ProcessName); 
        process.Kill(); 
       } 
       } 
      } 
File.Delete(filePath); 

而且关闭不终止的过程中,你必须调用CloseMainWindow或杀死。

+0

我的问题是process.kill()方法,我不想杀死我的应用程序的进程。是否有任何方式释放正在使用的文件。 – user703526

+0

当然,关闭在这个文件上打开的任何流。 – Guillaume

+0

这个文件作为连接字符串打开,我的意思是数据库文件的路径是连接字符串。我也关闭了所有的连接。 – user703526

3

Streams s为一次性的类型,你必须手动管理他们的一生,无论是由using语法,如:

using (StreamReader f = new ...) { 
} 

......或者更冗长做(这个语法,如果你需要分配和在不同的码块/功能)删除Stream

try { 
    StreamReader f = new ...; 
    ... 
} finally { 
    if (null != f) f.Dispose(); 
} 

...或通过使保持类的IDisposable本身。另请参阅What Your Mother Never Told You About Resource Deallocation


有趣的是,这似乎是那些https://stackoverflow.com/questions/2245196/c-urban-myths/2245382#2245382之一的现实化身:

0)在C++中,你必须惹指针周围,这是旧的和危险的,使用C#

Gee,#include boost/shared_ptr>或其中之一。事实上,它往往更容易在你的sowonderful C#产生混乱:

static void Main() { 
    foo(); 
    bar(); 
} 
static void foo() { 
    var f = new StreamWriter ("hello.txt"); 
    f.Write ("hello world"); 
} 
static void bar() { 
    var f = new StreamReader ("hello.txt"); 
    Console.WriteLine (f.ReadToEnd()); 
} 

“未处理IOException异常:该进程无法访问文件‘hello.txt的’,因为它正由另一个进程使用。“

这些说法,顺便说一句,通常是由那些谁碰巧从来没有听说过RAII制成,并且你能走多远,甚至没有智能指针得到。

+0

文件类是静态的。你不能新的,你不能处置它。编辑答案的第一部分,并用流替换文件。 – Guillaume

+0

谢谢,我解决了。 –

相关问题