- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些代码,当它执行时,它抛出一个IOException
,表示
该进程无法访问文件“文件名”,因为它正在被
另一个过程
这是什么意思,我能做些什么呢?
最佳答案
原因是什么?
错误消息非常清楚:您试图访问一个文件,并且它是不可访问的,因为另一个进程(甚至是同一个进程)正在使用它(并且它不允许任何共享)。
调试
这可能是很容易解决的(或者很难理解),这取决于你的具体场景。让我们看看。
您的进程是唯一访问该文件的进程。
你确信另一个过程是你自己的过程。如果知道是在程序的另一部分中打开该文件,则首先必须检查每次使用后是否正确关闭文件句柄。下面是出现此错误的代码示例:
var stream = new FileStream(path, FileAccess.Read);
var reader = new StreamReader(stream);
// Read data from this file, when I'm done I don't need it any more
File.Delete(path); // IOException: file is in use
FileStream
实现了
IDisposable
,所以很容易将所有代码包装到
using
语句中:
using (var stream = File.Open("myfile.txt", FileMode.Open)) {
// Use stream
}
// Here stream is not accessible and it has been closed (also if
// an exception is thrown and stack unrolled
private const int NumberOfRetries = 3;
private const int DelayOnRetry = 1000;
for (int i=1; i <= NumberOfRetries; ++i) {
try {
// Do stuff with file
break; // When done we can break loop
}
catch (IOException e) when (i <= NumberOfRetries) {
// You may check error code to filter some exceptions, not every error
// can be recovered.
Thread.Sleep(DelayOnRetry);
}
}
var stream = File.Open(path, FileOpen.Read);
var content = File.ReadAllText(path);
ReadAllText()
将失败,因为文件正在使用中(
File.Open()
在前面的行中)。事先打开文件不仅没有必要,而且是错误的。同样的情况也适用于不返回处理文件的句柄的所有
File
函数:
File.ReadAllText()
,
File.WriteAllText()
,
File.ReadAllLines()
,
File.WriteAllLines()
和其他(如
File.AppendAllXyz()
函数)都将自己打开和关闭文件。
if (File.Exists(path))
File.Delete(path);
File.Exists()
之后但在
File.Delete()
之前删除了文件,那么它将在您可能错误地感到安全的地方抛出一个
IOException
。
FileSystemWatcher
,请考虑推迟操作(因为您将收到通知,但应用程序可能仍以独占方式处理该文件)。
FileStream
(因为它不是线程安全的)。有关示例,请参见
this post和
this帖子。
FileShare
枚举来指示OS允许其他进程(或您自己进程的其他部分)同时访问同一文件。
using (var stream = File.Open(path, FileMode.Open, FileAccess.Write, FileShare.Read))
{
}
stream
线程的访问是安全的,因此除非以某种方式同步访问(参见前面的链接),否则不能将此对象与多个线程共享。其他共享选项也可用,它们打开了更复杂的场景。详情请参阅
this。
关于c# - IOException:该进程无法访问文件“文件路径”,因为它正在被另一个进程使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55695785/
我们有一个连接到某些网络服务的 Windows 窗体应用程序。它列出了系统中的文档,当用户双击一个文件时,我们将文件下载到本地计算机并打开文档供他们编辑。一旦用户关闭文档,我们就会将其上传回系统。 对
public class SampleCloseable implements AutoCloseable { private String name; public SampleCl
我正在尝试使用 JAVA 运行一个简单的 sqoop 导入程序。 我的程序: String driver="com.vertica.Driver"; Configuration con
我需要从 Java 执行一个外部程序(使用 libreoffice 将 fodt 文件转换为 pdf,就这样发生了)我知道该程序所需的精确命令行: /usr/bin/libreoffice --hea
AFAIK,标准try-with-resources 形式 try(InputStream is= new ...){ ... some reading from is } catch (..
我观察到这两种说法都是有效的。与第二个语句相比,第一个语句中记录的额外内容是什么? 最佳答案 第一个还记录原始异常(和堆栈跟踪),第二个仅记录消息。 因此,第一个语句中记录的“额外内容”是原始异常。这
我想执行重命名和删除功能,环境是LINUX。这是我正在使用的代码, String[] command_ary = { "/usr/bin/sh", "-c", command }; Runtime r
在使用 selenium webdriver 实现 Web 应用程序的自动化时,我遇到了一种情况,我需要上传文件并进一步继续。 我们为此使用 Java 和 Tcl 脚本语言。 下面是我的 TCL 代码
我正在尝试使用 ANT 将文件从一个目录复制到 Linux 上的另一个目录。 首先我使用了复制任务,它工作正常但文件模式没有保留。然后我改为使用 ,这就是我卡住的地方。 我的目标是这样的:
当我输入命令时: ./sqoop-import --connect jdbc:mysql://localhost/sqoop2 -table sqeep2 -m 1 -hive-import 当执行这
我正在使用 Sun 的 keytool 创建一个 Bouncy caSTLe keystore 并将证书导入其中。 keytool 确实会生成一个 Bouncy caSTLe 格式的 keystore
我正在执行下面的程序,它通过 java 调用 shell,我得到了异常请帮助我。 程序: import java.io.*; import java.util.*; public class Proc
我在我的一个项目中遇到了这个错误。 FAILURE: Build failed with an exception. What went wrong: Execution failed for tas
什么情况下read end可以死对偶PipedOutputStream和 PipedInputStream ?我没有关闭任何管道。 最佳答案 我遇到了java.io.IOException: Read
我有一段从文件中读取数据的代码。我想在此代码中强制 IOException 用于测试目的(我想检查代码在这种情况下是否抛出正确的自定义异常)。 例如,有什么方法可以创建一个防止被读取的文件?也许处理一
我为MapReduce文本排序编写了这样的代码: public static class SortMapper extends Mapper { private Text citizenshi
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我要createNewFile有一条路径,但我得到了一个 IOException。问题是,详细的消息无法解释,我只能看到一堆问号。 我最初使用的是西类牙语的 Windows 10,但安装了中文语言包。
我认为这是基本的东西,但我不知道该怎么做。为什么我得到 IOException never throw in body of相应的 try 语句 public static void main(Str
我正在从 Java 项目中的类路径读取文件。 示例代码: public static Properties loadPropertyFile(String fileName) {
我是一名优秀的程序员,十分优秀!