Javascript错误:磁盘已满

时间:2013-12-02 23:14:41

标签: javascript wpf webbrowser-control disk user-data

Exception "The disk is full " is thrown when trying to store data in usedata object in IE7+有关,但未得到答复:

我正在大量浏览使用WatiN使用Oracle ADF创建的政府网站。 该网站位于WPF窗口中 - > WindowsFormsHost - > WebBrowser控件。

网站通过保存和加载方法大量使用:http://msdn.microsoft.com/en-us/library/ie/ms531424(v=vs.85).aspx

浏览2-3分钟后,我在其中一个“保存”调用中收到以下javascript错误:

磁盘已满,字符#,行####

当我收到此错误时,WebBrowser控件呈现完全无用(无法执行其他javascript命令)并且必须重新启动我的应用程序。

我试图清除浏览器缓存,更改它的位置,清除localStorage,一切都无济于事。

重现错误的PC安装了IE10,但是通过注册表我在webbrowser控件中强制使用IE8 / IE9模式。

有没有办法解决这个问题?

有关这方面的信息非常稀缺,因此非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我在linux上,所以现在没办法测试,但有问题的文件没有存储在浏览器缓存中,but in

注意:从IE 10开始,这不再是水。参考。编辑下面的内容。

W7+: %HOMEPATH%\AppData\Roaming\Microsoft\Internet Explorer\UserData
   # c:\users\*user-name*\...

XP : %HOMEPATH%\Application Data\Microsoft\Internet Explorer\UserData
   # c:\Documents and Settings\*user-name*\...

或者,我猜,这个也可以(作为一个捷径),:

%APPDATA%\Roaming\Microsoft\Internet Explorer\UserData

修改或删除那里的文件。

请注意,这些文件被标记为受保护的操作系统文件,因此要在资源管理器中查看,您必须更改视图以包含这些文件。如果您使用cmd,就像在命令提示符中一样,您必须包含/a标志,如下所示:

dir /a

编辑1:

请注意,index.dat是一个保存有关分配大小等信息的信息,因此它不会(可能)帮助只删除/移动xml文件。

编辑2:

行。在运行IE 10的Windows 7中看一下这个。

在IE 7中(在XP上),上面提到的路径有一个index.dat文件,在userData保存时会更新。该文件包含各种信息,例如索引文件的大​​小,子文件夹的数量,所有文件的大小。然后是每个文件的条目,其中包含一个数字标识文件夹,保存它的URL,xml文件的名称,日期等。为此编写了一个简单的VBScript解析器,但是因为IE 10不使用index.dat文件是一种浪费。

在IE 10下,不再有各种index.dat文件,而是中央数据库文件:

%APPDATA%\Local\Microsoft\Windows\WebCache\

在我的系统上,数据库文件名为WebCacheV01.datV部分似乎在系统之间有所不同,可能是内部版本号而不是文件类型版本。

文件被严密锁定,因此,如果想要戳他们,一个解决方案就是使用shadow copyvscsc等工具制作Shadowcopy < / p>

无论如何,黑客WebCacheVxx.dat需要更多的工作,所以我不会尝试(至少现在)。

但是,请注册该文件获取带有旧位置路径的条目 - 例如,撰写someElement.save("someStorageName");时,WebCacheVxx.dat会收到如下条目:

...\AppData\Roaming\Microsoft\Internet Explorer\UserData\DDFFGGHH\someStorageName[1].xml

并在上述路径中创建相应的文件。

但是,本地container.dat未更新。


的UserData

至于手头的问题,清除localStorage无济于事,因为userData不属于该API。

无法找到关于如何清除userData的好例子。但是,一种方法是使用控制台。

来自this page的测试示例:

  1. 保存一些文字。
  2. F12 并输入以下内容以清除数据:

    /* ud as an acronym for userData */
    var i, at,
        ud_name = "oXMLBranch",
        ud_id   = "oPersistText",
        ud      = document.getElementById(ud_id); 
    
    /* To modify the storage one have to ensure it is loaded. */
    ud.load(ud_name); 
    
    /* After load, ud should have a xmlDocument where first child should hold 
     * the attributes for the storage. Attributes as in named entries. 
     *
     * Example: ud.setAttribute("someText", "Some text");
     *          ud.save(ud_name);
     *
     *          XML-document now has attribute "someText" with value "Some text".
     */
    at = ud.xmlDocument.firstChild.attributes;
    
    /* Loop attributes and remove each one from userData. */
    for (i = 0; i < at.length; ++i) 
        ud.removeAttribute(at[i].nodeName); 
    
    /* Finally update the file by saving the storage. */
    ud.save(ud_name);
    
  3. 或者作为一个单行:

    var ud_name = "oXMLBranch", ud_id = "oPersistText", i, at, ud = document.getElementById(ud_id); ud.load(ud_name); at = ud.xmlDocument.firstChild.attributes; for (i = 0; i < at.length; ++i) ud.removeAttribute(at[i].nodeName); ud.save(ud_name);
    

    消除一项限制

    这有一些问题。我们可以通过忽略ud_id来消除至少一个,而是创建一个新的DOM对象:

    var i, at,
        ud_name = "oXMLBranch", 
        ud      = document.createElement('INPUT'); 
    
    /* Needed to extend properties of input to include userData to userdata. */
    ud.style.behavior = 'url(#default#userdata)';
    
    /* Needed to not get access denied. */
    document.body.appendChild(ud); 
    
    ud.load(ud_name); 
    at = ud.xmlDocument.firstChild.attributes; 
    
    for (i = 0; i < at.length; ++i) 
        ud.removeAttribute(at[i].nodeName); 
    
    /* Save, or nothing is changed on disk. */
    ud.save(ud_name);
    
    /* Clean up the DOM tree */
    ud.parentNode.removeChild(ud);
    

    因此,应该能够通过知道存储的名称来清除userData,该名称应该与文件名相同(不包括[1].xml)或者查看页面源。


    更多问题

    在上述页面上进行测试我达到disk is full限制,为65,506字节。

    您的问题可能不是磁盘 已满,而是在输入数据超出限制的情况下进行了写入尝试。您可以尝试清除上面提到的数据并查看是否继续,否则您需要清除要写入的数据。

    然后,这很可能会破坏有问题的应用程序。

    换句话说,错误文本应该是这样的:

    写入NNN字节超出NNN限制 磁盘已满

    通过附加到窗口onerror进行测试,但遗憾的是找不到错误源:

    var x1, x2, x3, x4 ; 
    window.onerror = function () { 
         x1 = window.event; 
         x2 = x1.fromElement; // Yield null
         x3 = x1.srcElement;  // Yield null
         x4 = x1.type; 
    }; 
    

    结束记录

    除非 clear userData 方法解决了这个问题,否则我不知道接下来要去哪里。没有找到任何通过注册表或其他方式增加限制的选项。

    但也许它会让你更进一步。

    Super User可能有人能够提供帮助。