gpt4 book ai didi

matlab - 如何打开已使用文件共享权限打开的文件

转载 作者:行者123 更新时间:2023-12-02 02:35:43 36 4
gpt4 key购买 nike

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

有没有办法在Matlab中覆盖该文件?我不想使用 ActiveX 连接到 Excel session 并以这种方式编辑文件。

看到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 机器上打开该文件。

最佳答案

这些 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 将其读入内存一次,然后释放文件句柄。

在通过 shell 执行 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 将始终以只读方式打开,您不必摆弄文件属性。

关于matlab - 如何打开已使用文件共享权限打开的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8911848/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com