【问题标题】:How to open a file that is already open with fileshare permissions如何打开已使用文件共享权限打开的文件
【发布时间】:2012-01-19 01:29:23
【问题描述】:

我正在尝试覆盖 Windows 上 Matlab 中已存在的 csv 文件。问题是有时我在 Excel 中打开了文件。在这种情况下,写入操作会失败。

在 Matlab 中是否有覆盖文件的方法?我不想使用 ActiveX 连接到 Excel 会话并以这种方式编辑文件。

看到this post about FileShare settings 让我觉得这是可能的,但似乎没有一个 fopen 参数能够做到这一点。 Excel 可能会锁定具有独占写入权限的文件,在这种情况下无法绕过它。有人知道如何检查吗?

问题示例:

% make csv file
x = magic(4);
csvwrite('foo.csv', x);

% open foo.csv in EXCEL

% try writing again
csvwrite('foo.csv', x);  % cannot write a new file
[fid, msg] = fopen('foo.csv' ,'w');  % cannot open handle for writing

附带说明一下,当文件存在于 Linux 机器上时,我曾经能够覆盖在 Excel 中打开的文件,并且我通过网络在 Windows 机器上打开了该文件。

【问题讨论】:

  • 您是否尝试在 Excel 中以只读模式打开文件?
  • 我确信这会起作用,但我很懒,不想手动决定我要编辑哪些文件以及我可能在 Matlab 中覆盖哪些文件。

标签: matlab


【解决方案1】:

这些 FileShare 设置适用于从 Win32 API 的 CreateFile 系列函数打开的文件,而不是 Matlab 公开的 C 样式 fopen 系列。 fopen 选项不会让您到达那里。请参阅http://support.microsoft.com/kb/99173 以快速了解差异。 (如果您真的想使用 CreateFile 或其他 Win32 I/O,例如检查 Excel 是否已锁定文件或自己锁定文件,您可以使用 System.IO.File 从 Matlab 通过 .NET 调用它。)

无论如何,默认情况下,Excel 以写入模式打开文件,并获得排他(写入)锁定。所以你无论如何都不能打开它来写,那些文件共享设置只会让你打开文件来阅读。如果您希望能够在 Excel 中打开 Excel 文件时覆盖它,您需要让 Excel 以只读模式打开它,就像 katrasnikj 建议的那样。这会导致 Excel 将其读入内存一次,然后释放文件句柄。

在写入这些文件后,尝试打开这些文件的只读文件属性,方法是使用attrib 命令。这将导致 Excel 默认以只读方式打开它们。然后在从 Matlab 打开它进行重写之前清除只读属性。

if exist(file, 'file')
    [status,result] = system(sprintf('attrib -R "%s"', file));
end
[fid,msg] = fopen(file, 'w');
% ... write the file and close it ...
[status,result] = system(sprintf('attrib +R "%s"', file));

读取器和写入器之间仍然存在竞争条件,但是如果您快速写入文件,它将是一个短窗口。最好将 csv 写入同一目录中的临时文件,然后关闭只读属性足够长的时间以将新文件替换为 movefilejava.io.File.renameTo。仍然是一场比赛,但可能足以在实践中使用。

您还可以更改文件所在目录的权限,以便您的编写器进程具有修改权限,但运行 Excel 的用户只有读取权限。然后 Excel 将始终以只读方式打开,您不必摆弄文件属性。

【讨论】:

    猜你喜欢
    • 2016-12-21
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多