繁体   English   中英

文件正被另一个进程使用

[英]File is being used by another process

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

要执行 cleandatabse 任务,我必须停止所有正在运行的进程,这样做之后,如果我点击 clean database 它会抛出一个文件无法删除的错误,它正在被另一个进程使用。我能够停止所有正在运行的线程。

不知何故,我能够找到哪个进程正在阻止文件,

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,它关闭了我正在运行的 window 表单。 在不使用 kill 的情况下,我尝试关闭并处理这对我不起作用。

你能帮我在不关闭应用程序的情况下从进程中释放文件,然后删除 db 文件吗?

先感谢您

此致

桑吉塔。

您应该确保关闭每个 stream 打开它:

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

如果你不放这个using语句,会导致很多bug,即使你手动关闭它str.Close();

Streams是一次性类型,您必须手动管理它们的生命周期,或者using语法,例如:

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

...或者更详细地执行此操作(如果您在不同的代码块/函数中分配和删除Stream ,则需要此语法):

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

...或通过使持有 class 本身成为IDisposable 另请参阅您的母亲从未告诉过您的有关资源重新分配的内容。


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

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

哎呀,#include boost/shared_ptr>或类似的之一。 实际上,在您的奇妙 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 的人提出的,以及没有智能指针你能走多远。

不确定,但您可能会在当前进程上调用 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);

此外,Close 不会终止进程,您必须调用 CloseMainWindow 或 Kill。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM