自动保存笔记本(或mathematica中的其他类型文件)文件

时间:2011-08-25 16:18:02

标签: wolfram-mathematica versioning autosave

我有时候一直面临这个问题,部分原因是Microsoft Office会自动保存您正在处理的文件版本和自动恢复。

很多时候,当我在mathematica中开始使用新笔记本进行某些测试时,我经常忘记保存我正在做的事情。

每隔一段时间,根据我使用的计算机,计算机崩溃,我正在做的所有美好工作都将永远丢失......

有没有办法绕过这个另外一个每五分钟手动保存我的文件?文件版本怎么样?

BTW:使用MMA V8

4 个答案:

答案 0 :(得分:8)

关于自动保存,您可能需要查看NotebookAutoSave选项,该选项可以通过Fromat->Option Inspector设置为True。您必须选择“已选择的笔记本”,然后转到Notebook Options -> File Options,并将NotebookAutoSave设置为True。然后,每次评估后都会保存您的笔记本。这是否是一个令人满意的解决方案,当然取决于具体情况。

但我的经验是,最可靠的方法是开发一个CTRL + S反射 - 这个反射永远不会让我失望并且工作得很好。

对于版本控制,使用包更容易,您可以使用WorkBench,它集成了对CVS的支持并通过Eclipse插件支持SVN。对于笔记本电脑,我建议您使用this SO线程。您可能还会发现this Mathgroup对某些兴趣的讨论。

修改

对于M8,出于自动保存的目的,您也可以运行

RunScheduledTask[NotebookSave[EvaluationNotebook[]],{300}]

但我目前无法测试此代码

<强> EDIT2

我刚刚在Toolbag存储库中发现this帖子 - 这也可能是问题自动保存部分的替代方案(但请参阅有关计划任务与{的相对优势的评论中的讨论。 {1}})

答案 1 :(得分:5)

由于你有MMA版本8,你可以使用:

saveTask = CreateScheduledTask[FrontEndExecute[FrontEndToken["Save"]], 5*60];
StartScheduledTask[saveTask];

每5分钟保存一次(其他时间更改为5 * 60)。

要删除自动保存任务,请使用:

RemoveScheduledTask[saveTask];

要仅保存固定的特定笔记本,请将其句柄存储在nb中(使用NotebooksSelectedNotebookInputNotebookEvaluationNotebook查找)并使用{{1而不只是FrontEndToken[nb,"Save"]

答案 2 :(得分:0)

我有一个提供自动备份功能的Mathematica软件包。启用后,当前笔记本 - 称之为“blah.nb” - 将在经过一段可配置的时间后备份到“blah.nb~”。我经常使用它,它使我免于多次失去工作。它比自动保存更好,因为它不会触及实际的笔记本文件:如果你搞砸了什么或者某些东西被破坏了你不想覆盖你的主文件。 :)

它在GitHub上here

答案 3 :(得分:0)

我有一个自动保存例程,每隔5分钟(或者您喜欢的任何时间间隔)保存每个打开的,修改过的笔记本的副本。它会单独留下您手动保存的副本,并保存一个&#34;交换文件& #34;在一个单独的目录中,如果需要可以很容易地恢复。代码(要复制到init.m)在这个答案中给出:https://mathematica.stackexchange.com/questions/18380/automatic-recovery-after-crash/65852#65852,并在下面复制:

由于同样的担忧,我编写了以下代码并将其添加到我的init.m文件中。您有两个主要条目要更改才能使用此条目。全局变量$ SwapDirectory是保存交换文件的位置(通过交换文件,我的意思是它在VIm意义上;&#34;额外&#34;笔记本的副本,与手动保存的副本分开,定期保存任何新的工作)。交换文件在交换目录中组织在一个目录结构中,该目录结构反映了#34;他们原来的文件位置,并且有#34; .swp&#34;附加到他们的文件名。您可能想要更改的另一个变量是自动保存之间的秒数,由&#34; 300&#34; (相当于5分钟)靠近下面代码的底部。在适当的时候,此代码将(自动在后台)保存所有打开的笔记本的交换文件,除非它们未从手动保存的版本中修改(此异常使代码更有效,更重要的是,防止交换存储文档笔记本的文件,例如)。

在目前的形式中,代码不仅仅过滤输入单元格,但希望您可以使用其他答案自行进行修改。

有些事需要注意:
1)即使启用了脱机访问,Mathematica Put命令似乎也无法写入网络驱动器。因此,最好选择本地计算机上的SwapDirectory。

2)在SwapDirectory中,您应该创建一个名为&#34; Recovery&#34;的子目录。这是AutoSaveSwap例程将初始保存任何没有现有手动保存位置的笔记本的地方。

3)简单评估     RecoverSwap [&#34;文件路径&#34;] 其中&#34; filePath&#34;是一个字符串,表示文件的MANUALLY-SAVED副本的filePath(即,不是由AutoSave创建的文件)。然后,这将弹​​出一个窗口,其中包含该文件的最新自动保存版本。手动保存的版本永远不会被覆盖,除非您明确选择这样做。弹出恢复后的版本后,您可以随意保存,也可以自行决定丢弃。

4)您应该将此代码添加到init.m的KERNEL版本($ UserBaseDirectory / Kernel / init.m)而不是前端版本...这样,如果您退出并重新启动内核,自动保存功能也将重启。另一方面,这意味着每次启动或重新启动后必须至少评估一个表达式才能开始自动保存。完成初始评估后,您无需评估要备份的单元格(与内置自动保存实用程序不同)。

希望这有助于某人!如果您有任何问题,建议或改进要求,请随时回复。而且,如果你发现这篇文章很有用,那么upvotes最受欢迎!照顾自己。

    $SwapDirectory= "C:\\Users\\pacoj\\Swap Files\\"; 
    SaveSwap[nb_NotebookObject]:=Module[
        {fileName, swapFileName, nbout, nbdir, nbdirout, recoveryDir},
        If[ ! SameQ[Quiet[NotebookFileName[nb]], $Failed],
        (* if the notebook is already saved to the file system *)
            fileName = Last[ FileNameSplit[ NotebookFileName[nb]] ];
            swapFileName = fileName <> ".swp";
            nbdir = Rest[FileNameSplit @ NotebookDirectory[nb]];
            nbdirout= FileNameJoin[ FileNameSplit[$SwapDirectory]~Join~nbdir]<>"\\";
            If[!DirectoryQ[nbdirout], CreateDirectory[nbdirout]];
            nbout = NotebookGet[nb];
            Put[nbout, nbdirout <> swapFileName],
            (* else, if the file has never been saved, save as untitled *)
            recoveryDir= $SwapDirectory <> "Recovery\\\";
            fileName= ("WindowTitle" /. NotebookInformation[nb])<>".nb";
            NotebookSave[nb, recoveryDir <> fileName]
        ] 
    ]; 
    RecoverSwap::noswp= "swap file `1` not found in expected location";
    RecoverSwap[nbfilename_String]:=Module[
        {fileName, swapFileName, nbin, nbdir, nbdirout},
        fileName= Last[ FileNameSplit[ nbfilename] ];
        swapFileName= fileName <> ".swp";
        nbdir= Most[ Rest[FileNameSplit @ nbfilename] ];
        nbdirout= FileNameJoin[ FileNameSplit[$SwapDirectory]~Join~nbdir]<>"\\\";
        If[ FileNames[swapFileName, {nbdirout}] == {},
           Message[RecoverSwap::noswp,nbdirout <> swapFileName]; Return[],
           nbin= Get[nbdirout <> swapFileName]; NotebookPut[nbin]
        ] 
    ]; 
    AutoSaveSwaps= CreateScheduledTask[
        SaveSwap /@ Select[Notebooks[], "ModifiedInMemory" /. NotebookInformation[#]&],
        300 
    ] 
    StartScheduledTask[AutoSaveSwaps]