有没有办法检查文件是否被锁定而不使用try/catch块?
现在,我所知道的唯一方法就是打开文件并抓住任何文件System.IO.IOException.
我们有一个项目存储在我们的TFS服务器中,一些文件由我从另一台计算机和另一个用户(两个都不再使用)签出.有没有办法强制解锁文件(没有对它进行任何更改,所以如果我只能这样做,这样做是安全的).
在PowerShell中使用,如何检查应用程序是否锁定文件?
我想检查哪个进程/应用程序正在使用该文件,以便我可以关闭它.
我有一个进程,它会被cron相当频繁地调用,以读取其中包含某些与移动相关的命令的文件.我的进程需要读取和写入此数据文件 - 并将其锁定以防止其他进程在此期间触摸它.用户可以执行完全独立的过程(可能)写入/附加到该相同的数据文件.我希望这两个进程运行良好,并且一次只访问一个文件.
nio FileLock似乎是我需要的(没有编写我自己的信号量类型文件),但是我无法将其锁定以供阅读.我可以锁定并写入正常,但在读取时尝试创建锁定时会出现NonWritableChannelException.甚至可以锁定文件进行阅读吗?看起来像RandomAccessFile更接近我的需要,但我不知道如何实现它.
这是失败的代码:
FileInputStream fin = new FileInputStream(f);
FileLock fl = fin.getChannel().tryLock();
if(fl != null)
{
System.out.println("Locked File");
BufferedReader in = new BufferedReader(new InputStreamReader(fin));
System.out.println(in.readLine());
...
Run Code Online (Sandbox Code Playgroud)
FileLock行抛出异常.
java.nio.channels.NonWritableChannelException
at sun.nio.ch.FileChannelImpl.tryLock(Unknown Source)
at java.nio.channels.FileChannel.tryLock(Unknown Source)
at Mover.run(Mover.java:74)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
它说,看看JavaDocs
尝试写入最初未打开以进行写入的通道时,抛出未经检查的异常.
但我不一定要写信给它.当我尝试创建FileOutpuStream等用于写入目的时,我很高兴,直到我尝试在同一文件上打开FileInputStream.
StreamReader在读取文本文件时会锁定它.
我可以强制StreamReader以"只读"或"非锁定"模式工作吗?
我的解决方法是将文件复制到临时位置并从那里读取,但我更愿意直接使用StreamReader.任何替代建议?
背景:
我写了一个小应用程序来从日志文件中获取一些统计信息.该文件不断被外部程序更新(每秒几次),可以调用AAXXYY.
查看输出表明我的应用程序可能正在锁定文件并阻止AAXXYY写入.
这就是我正在做的事情
private void btnGetStats_Click(object sender, EventArgs e)
{
int countStarts = 0;
int countEnds = 0;
IList<string> sessions = new List<string>();
using(StreamReader stRead = new StreamReader(openFileDialog1.FileName,Encoding.Unicode))
{
while(!stRead.EndOfStream)
{
string line = stRead.ReadLine();
if(line.Contains("Session start"))
{
countStarts++;
sessions.Add(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
}
if (line.Contains("Session end"))
{
countEnds++;
sessions.Remove(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
}
}
}
txtStarts.Text = countStarts.ToString();
txtEnds.Text = countEnds.ToString();
txtDifference.Text = (countStarts - countEnds).ToString();
listBox1.DataSource = sessions;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试调试用户偶尔会锁定他们尝试打开的文件的问题.代码似乎具有正确的异常处理,但用户仍在报告查看错误消息.如何模拟锁定的文件以便我自己调试?
编辑:对于Windows.
在Bash中,我试图使函数getLock与不同的锁名称一起使用.
function getLock
{
getLock_FILE="${1}"
getLock_OP="${2}"
case "${getLock_OP}" in
"LOCK_UN")
flock -u "${getLock_FILE}"
rm -fr "${getLock_FILE}"
;;
"LOCK_EX")
flock -x "${getLock_FILE}"
esac
}
Run Code Online (Sandbox Code Playgroud)
但是弗洛克说 flock: bad number: myfilelock
我怎样才能锁定文件,并在需要时释放它,而不必在flock中执行命令?
它是这样使用的:
getLock myfilelock LOCK_EX
somecommands
........
getLock myfilelock LOCK_UN
Run Code Online (Sandbox Code Playgroud) 我想知道是否可以将readonly FileStream转换为锁定文件?我现在尝试读取锁定文件时出现异常.
using (FileStream stream = new FileStream("path", FileMode.Open))
Run Code Online (Sandbox Code Playgroud)
谢谢!
在尝试对此类文件进行任何操作之前,我需要知道.
大多数人应该知道close()也关闭任何流使用.
这允许以下代码:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();
Run Code Online (Sandbox Code Playgroud)
这很好,因为我们不需要引用FileInputStream并记得关闭它.
但是它也适用于FileLocks吗?
final FileInputStream fis = new FileInputStream(new File("buffer.txt"));
final FileChannel c = fis.getChannel();
final FileLock lock = c.lock(0L, Long.MAX_VALUE, true);
final BufferedReader br = new BufferedReader(new InputStreamReader(fis));
try {
while(br.ready()) {
System.out.println(br.readLine());
}
} finally {
br.close();
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这段代码并且在br.close()调用时正确释放了锁,但这样做是否安全?该可关闭的JavaDoc说,"关闭此流并释放与之关联的所有系统资源." 我可以安全地假设我正在使用锁定close()指定release()的吗?
filelock ×10
.net ×3
c# ×3
file-locking ×2
java ×2
batch-file ×1
c#-4.0 ×1
command-line ×1
concurrency ×1
filestream ×1
flock ×1
io ×1
linux ×1
logging ×1
nio ×1
powershell ×1
scripting ×1
simulate ×1
tfs ×1
windows ×1
windows-xp ×1