Javascript错误:磁盘已满



与异常的关系"磁盘已满";当试图将数据存储在IE7+中的usedata对象中时抛出,该对象未得到答复:

我正在使用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,一切都无济于事。

再现错误的电脑安装了IE10,但通过注册表,我在网络浏览器控件中强制使用IE8/IE9模式。

有什么办法绕过这个问题吗?

关于这方面的信息非常稀少,因此我们将非常感谢您的帮助。

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

注意:从IE 10开始,这已经站不住脚了。请参阅下面的编辑2

W7+: %HOMEPATH%AppDataRoamingMicrosoftInternet ExplorerUserData
   # c:users*user-name*...
XP : %HOMEPATH%Application DataMicrosoftInternet ExplorerUserData
   # c:Documents and Settings*user-name*...

或者,我想,这个也行(作为捷径),:

%APPDATA%RoamingMicrosoftInternet ExplorerUserData

修改或删除那里的文件。

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

dir /a

编辑1:

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

编辑2:

好的。在运行IE10的Windows7中看到了这一点。

在IE 7(在XP上)中,上述路径有一个index.dat文件,该文件在保存时由userData更新。该文件包含各种信息,如索引文件的大小、子文件夹的数量、所有文件的大小。然后,每个文件都有一个条目,其中包含一个编号,标识文件夹、保存位置的url、xml文件的名称、日期等。为此编写了一个简单的VBScript解析器,但由于IE 10不使用index.dat文件,这是一种浪费。

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

%APPDATA%LocalMicrosoftWindowsWebCache

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

文件被严格锁定,因此,如果想查看它们,一个解决方案是使用vscsc、Shadowcopy等工具进行卷影复制。

无论如何,破解WebCacheVxx.dat需要更多的工作,所以我(至少目前)没有尝试过。

但是,注册文件获得一个路径为旧位置的条目——例如,在写入someElement.save("someStorageName");时,WebCacheVxx.dat获得一个条目,如:

...AppDataRoamingMicrosoftInternet ExplorerUserDataDDFFGGHHsomeStorageName[1].xml

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

然而,本地container.dat不被更新。


userData

至于当前的问题,清除localStorage将没有帮助,因为userData不是API的一部分。

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

本页测试示例:

  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);
    

或者作为一行:

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);

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


更多问题

在上面提到的页面上测试,我达到了65506字节的disk is full限制。

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

再说一遍,这很可能会破坏有问题的应用程序。

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

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方法解决了这个问题,否则我不知道下一步该去哪里。没有找到任何通过登记或其他方式增加限额的选择。

但也许它会让你走得更远。

超级用户可能有人可以提供帮助。

最新更新