2012-01-18 99 views
3

我想覆蓋在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 

作爲一個方面說明,我曾經是能夠覆蓋文件在Excel中打開時,該文件在Linux中存在,我在網絡上打開文件在Windows機器上。

+0

您是否嘗試以只讀模式在Excel中打開文件? – katrasnikj 2012-01-18 14:45:30

+0

我敢肯定,這將工作,但我很懶,不想手動決定我想編輯哪些文件,哪些我可能會覆蓋在Matlab中。 – 2012-01-18 15:07:18

回答

2

這些FileShare設置用於從Win32 API的CreateFile功能家族打開的文件,而不是Matlab公開的C風格fopen家族。 fopen選項不會讓你在那裏。請參閱http://support.microsoft.com/kb/99173以快速瞭解差異。 (如果您真的想使用CreateFile或其他Win32 I/O,例如檢查Excel是否鎖定文件或自己鎖定文件,可以使用System.IO.File通過.NET從Matlab調用它。)

無論如何,默認情況下,Excel以寫入模式打開文件,並獲得獨佔(寫入)鎖定。因此,無論如何您都無法打開它,這些文件共享設置只會讓您打開文件進行閱讀。如果您希望能夠在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的用戶只具有讀取權限。然後,Excels將總是以只讀方式打開,而不必亂搞文件屬性。