[英]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.