Как запустить URL с #anchor в Java? - PullRequest
1 голос
/ 08 февраля 2012

Я запускаю URL, используя следующий код в Java:

Runtime.getRuntime().exec("rundll32 url.dll, FileProtocolHandler " + myURL)

Здесь myURL - это " file: /// C: /Desktop/test.html#bottom"

Когда я передаю URL-адрес таким образом, он выполняет только « file: /// C: /Desktop/test.html»

Это не включает # низ .

Как правильно запустить этот URL в Java?

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

Другой способ сделать это (из Как запустить URL протокола файла с привязкой из Java? ):

Runtime.getRuntime().exec("cmd.exe start file:///C:/foo/bar.html#anchor")

Обновление:

Еще одна ссылка с этой проблемой (с использованием url.dll) показывает, что автор возвращается к попытке внешней программы, в данном случае Quero : Runtime.getRuntime().exec("cmd.exe qlaunch.exe open=\"file:///c:/temp/test.html?p=1\"");

Из того, что я могу сказать, это ошибка в Windows и / или Internet Explorer, в частности. Firefox имеет другие проблемы с протоколом file://, которые необходимо отключить вручную.


Обновление 2:

Это определенно ожидаемое поведение или ошибка в самой Windows. Использование Desktop.browse (, которое отправляет чистый URI в ShellExecute ) или cmd.exe start или Runtime.getRuntime().exec("rundll32 url.dll " + uri), или даже просто открытие командной строки и ввод самого URI file:// просто заканчивают тем, что я делаю (что я найдено через Process Monitor):

Process Monitor screenshot

Показан порядок операций:

  1. (1-й блок) Thread Create = когда я нажимаю enter в окне cmd выше
  2. Найдите файл, пройдя по дереву каталогов (например, перейдите в c:, войдите в temp)
  3. (2-я ячейка) Когда этот файл найден, выполняется ОСТАНОВКА (что означает, что Windows проанализировала символы # и ?)
  4. (3-й блок) DONE look (CloseFile в родительской папке, после которого больше нет дискового ввода-вывода)
  5. (4-е поле) Теперь, когда файл найден, посмотрите, какие файлы .htm открываются (например, в вашем браузере)
  6. Как ни странно, позже он находит Chrome (браузер по умолчанию), но запускает IE (?!) И , затем запускает Chrome - это может быть большой частью проблемы.

Обратите внимание, что вызов start iexplore file:///c:/temp/test.html#mark работает , потому что он просто передает параметр, не пытаясь сделать что-то особенное.

Обратите внимание, что шаги 2 и 3 нарушают собственные рекомендации Microsoft от 2006 года ( см. Здесь ), но из того, что я видел, это поведение было введено во время выхода IE7. Я предполагаю, что это исправило некоторую ошибку или уязвимость в Windows за счет возможности сделать это вообще.

После еще одного исследования выяснилось, что file: URI в Windows имели очень sordid прошлых

Как ни странно, в статье Microsoft за 2010 год показано file://host/path/file.txt?Query#fragment в качестве действительного URI в .Net ...

Я думаю, что вам может не повезти, пока кто-то не найдет магический параметр реестра - или вы можете вручную вызвать браузер (например, Runtime.getRuntime().exec(chromepath + "chrome.exe file:///c:/temp/test.html#jump") или Runtime.getRuntime().exec(iepath + "iexplore.exe file:///c:/temp/test.html#jump"))

Или, для развлечения: Runtime.getRuntime().exec("cmd.exe start iexplore " + myURL)

0 голосов
/ 08 февраля 2012

Используйте Desktop.browse(URI) (который может работать на * nix и OS X, а также Windows).


Обновление:

ОК- сотрите это.Сетевые URI будут прокручиваться до якоря, а дисковые URI - нет.Выдано сообщение об ошибке в Oracle (ID: 7143677 - Desktop.browse() - привязки игнорируются для локальных URI ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...