1

IE7+ で usedata オブジェクトにデータを保存しようとすると、例外「ディスクがいっぱいです」がスローされますが、これは未回答のままです。

私は、WatiN を使用して Oracle ADF で作成された政府の Web サイトを頻繁に閲覧しています。Web サイトは WPF ウィンドウ --> WindowsFormsHost --> WebBrowser コントロールにあります。

Web サイトでは、save メソッドと load メソッドを介して、 http: //msdn.microsoft.com/en-us/library/ie/ms531424 (v=vs.85).aspxを多用しています。

2 ~ 3 分のブラウジングの後、「保存」呼び出しのいずれかで次の JavaScript エラーが発生します。

ディスクがいっぱいです。文字 #、行 ####です。

このエラーが発生すると、WebBrowser コントロールはまったく役に立たなくなり (これ以上 JavaScript コマンドを実行できなくなります)、アプリを再起動する必要があります。

ブラウザのキャッシュをクリアし、その場所を変更し、localStorageをクリアしようとしましたが、すべて役に立ちませんでした。

エラーを再現する PC には IE10 がインストールされていますが、レジストリを介して Web ブラウザー コントロールで IE8 / IE9 モードを強制します。

この問題を回避する方法はありますか?

これに関する情報は非常に少ないため、どんな助けも大歓迎です。

4

1 に答える 1

1

私は Linux を使用しているので、今これをテストする方法はありませんが、問題のファイルはブラウザーのキャッシュには保存されませんが、

注: IE 10 以降、これは水を保持しなくなりました。参考文献 以下の2を編集します。

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.dat。そのV部分はシステム間で異なるようで、おそらくファイル タイプのバージョンではなく社内のバージョン番号です。

ファイルはしっかりとロックされているため、それらを突っ込みたい場合の解決策の 1 つは、 vscscShadowcopyなどのツールを使用してシャドウ コピーを作成することです。

とにかく、ハッキングWebCacheVxx.datにはもっと多くの作業が必要になるため、私はそれを試みません (少なくとも今のところ)。

ただし、ファイルが古い場所へのパスを含むエントリを取得するように登録します。たとえば、の書き込みではsomeElement.save("someStorageName");WebCacheVxx.dat次のようなエントリを取得します。

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

対応するファイルが上記のパスに作成されます。

container.datただし、ローカルは更新されません。


ユーザーデータ

当面の問題に関しては、その API の一部ではlocalStorageないため、クリアは役に立ちません。userData

クリアする方法の良い例が見つかりませんuserData。ただし、1 つの方法は、コンソールを使用することです。

このページでのテストの例:

  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 オブジェクトを作成することで、少なくとも 1 つを削除できます。

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 full65,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メソッドで問題が解決しない限り、次にどこに行けばよいかわかりません。レジストリまたはその他の手段で制限を引き上げるオプションは見つかりませんでした。

しかし、おそらくそれはあなたをもう少し先に進めます.

スーパーユーザーに助けてくれる人がいるかもしれません。

于 2013-12-02T23:46:27.963 に答える