Pregunta

Me developp una aplicación Java usando búsqueda en el escritorio de la que puede recuperar algo de información acerca de los archivos en mi computadora, como URL ( System.ItemUrl ). Un ejemplo de tal url es

file://c:/users/ausername/documents/aninterestingfile.txt

para archivos "normales". Este campo también se dan las direcciones URL de los elementos de correo indexado desde Outlook o Thunderbird. artículos de Thunderbird (sólo disponible utilizando Vista y siete) son también archivos (.wdseml). Sin embargo, las direcciones URL de artículos perspectivas comienzan con "mapi: //" como:

mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가

El problema que tengo está abriendo el elemento real a partir de Java en Outlook utilizando esta URL. Si copiar / pegar en el diálogo de ejecución de Windows, funciona; también funciona si uso "Inicio" seguido por la URL copiado / pegado en la línea de comandos.

La url parece estar codificado en UTF-16. Quiero ser capaz de escribir dicho código:

String url = "mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가";

Runtime.getRuntime().exec("cmd.exe /C start " + url);

Yo no funciona y he intentado otras soluciones como:

String start = "start";
String url = "mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가";

FileOutputStream fos = new FileOutputStream(new File("test.bat");
fos.write(start.getBytes("UTF16");
fos.write(url.getBytes("UTF16"));
fos.close();

Runtime.getRuntime().exec("cmd.exe /C test.bat");

sin ningún éxito. El uso de la solución anterior, el archivo "test.bat" contiene la dirección URL correcta y el "inicio" de comandos, pero la racha de resultados "test.bat" en el mensaje de error conocido:

'■' is not recognized as an internal or external command, operable program or batch file.

Alguien ha una idea para poder abrir "MAPI: //"? Artículos de Java

¿Fue útil?

Solución

Bueno, mi pregunta era un poco complicado. Pero finalmente encontré una respuesta y voy a compartir aquí.

Lo que sospechaba era cierto: Windows utiliza UTF-16 URL (Little Endian). Hace que no hay diferencias que trabajan en UTF-8 cuando sólo utilizamos rutas a los archivos como imágenes, texto, etc. Pero para poder acceder a los elementos de Outlook, debemos usar UTF-16LE. Si estuviera de codificación en C #, no habría habido ningún problema. Pero en Java, usted tiene que ser más inventiva.

A partir de búsqueda en el escritorio, recupero la siguiente:

mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가

Y lo que he hecho es crear un script VB temporal y ejecutarlo como esto:

/**
 * Opens a set of items using the given set of paths.
 */
public static void openItems(List<String> urls) {
  try {

    // Create VB script
    String script =
      "Sub Run(ByVal sFile)\n" +
      "Dim shell\n" +
      "Set shell = CreateObject(\"WScript.Shell\")\n" +
      "shell.Run Chr(34) & sFile & Chr(34), 1, False\n" +
      "Set shell = Nothing\n" +
      "End Sub\n";

    File file = new File("openitems.vbs");

    // Format all urls before writing and add a line for each given url
    String urlsString = "";
    for (String url : urls) {
      if (url.startsWith("file:")) {
        url = url.substring(5);
      }
      urlsString += "Run \"" + url + "\"\n";
    }

    // Write UTF-16LE bytes in openitems.vbs
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(script.getBytes("UTF-16LE"));
    fos.write(urlsString.getBytes("UTF-16LE"));
    fos.close();

    // Run vbs file
    Runtime.getRuntime().exec("cmd.exe /C openitems.vbs");

  } catch(Exception e){}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top