2011-09-02 9 views
6

Voglio aprire il percorso del file con la finestra Explorer. Sto usando C# con il codice diC#: System.Diagnostics.Process.Start ("Explorer.exe", @ "/ select" + FilePath). Impossibile aprire il file quando il nome del file è unicode carattere

System.Diagnostics.Process.Start("Explorer.exe", @"/select," + FilePath) 

funziona bene con semplice carattere inglese, ma non poteva aprire la posizione del file se il nome del file è di caratteri Unicode (a tailandese lingua).

Chiunque può aiutare per favore?

+0

ho deciso che il problema è le parole con le vocali thailandesi che sono composti con i caratteri consonanti. Per esempio. ภาษา ไทย ("Thai language") funziona bene, ma ปู (granchio) fallisce. L'ovvia differenza è la forma di normalizzazione Unicode; la mia comprensione è che le forme Windows NFC e NFD di un nome di file non sono uguali. Ma non ho ancora capito come aggirare questo problema; semplicemente chiamando '' '' mystring.Normalize (...) '' '' sull'argomento non aiuta. –

risposta

3

provare a mettere tra virgolette:

System.Diagnostics.Process.Start("Explorer.exe", @"/select,""" + FilePath + "\"") 
+0

Siamo spiacenti, non funziona. apre invece la cartella My Document. –

+0

@YongKuy: Si prega di postare il percorso che si sta utilizzando qui –

+0

"E: \\ Test \\ លួច ស្រលាញ់ សង្សារ គេ .DAT" –

2

Nessun problema con questo frammento di codice:

static void Main(string[] args) { 
     string path = @"c:\temp\លួចស្រលាញ់សង្សារគេ.DAT"; 
     System.IO.File.WriteAllText(path, "hello"); 
     string txt = System.IO.File.ReadAllText(path); 
    } 

Windows 7, si crea e visualizza il file correttamente in Esplora risorse. Non hai documentato la versione del tuo sistema operativo in modo che sia una modalità di errore, anche se molto piccola. Molto più probabile è un problema con il file system mappato su E: drive. Come un volume FAT32 su un'unità flash o un redirector di rete. Poni domande a riguardo, rispettivamente, su superuser.com e serverfault.com. Non dimenticare di documentare quei dettagli essenziali.

0

Il seguente codice funziona con file con caratteri coreani (sono caratteri unicode). Si prega di provare e fammi sapere se funziona.

 ... 
     if (this.IsDirectory()) 
     { 
      OpenFileWith("explorer.exe", this.FullPath, "/root,"); 
     } 
     else 
     { 
      OpenFileWith("explorer.exe", this.FullPath, "/select,"); 
     } 
     ... 

    public static void OpenFileWith(string exePath, string path, string arguments) 
    { 
     if (path == null) 
      return; 

     try 
     { 
      System.Diagnostics.Process process = new System.Diagnostics.Process(); 
      process.StartInfo.WorkingDirectory = Path.GetDirectoryName(path); 
      if (exePath != null) 
      { 
       process.StartInfo.FileName = exePath; 
       //Pre-post insert quotes for fileNames with spaces. 
       process.StartInfo.Arguments = string.Format("{0}\"{1}\"", arguments, path); 
      } 
      else 
      { 
       process.StartInfo.FileName = path; 
       process.StartInfo.WorkingDirectory = Path.GetDirectoryName(path); 
      } 
      if (!path.Equals(process.StartInfo.WorkingDirectory)) 
      { 
       process.Start(); 
      } 
     } 
     catch(System.ComponentModel.Win32Exception ex) 
     { 
      FormManager.DisplayException(ex, MessageBoxIcon.Information); 
     } 
    } 
+0

Non funziona per me, ma comunque grazie a –

0

Explorer andrà a una cartella predefinita in questo caso 'My Documents', se la cartella che si sta tentando di aprire non c'è. Assicurati che esista.

+0

Perché il downvote? –

0

Ecco l'accordo per quanto ho determinato: almeno a partire da Windows 8.1, "Explorer.exe" sembra rimuovere tutti i caratteri combinati prima di cercare il file. Puoi testare questo in C# o in una console (fai prima chcp 65001 per entrare in modalità Unicode). Se provi ad aprire un bersaglio chiamato ปู (thai for "crab") non funzionerà, ma se rimuovi il segno vocalico in modo da avere solo ป, funzionerà. Inoltre, se si ha una cartella denominata ป e si sta per aprire ปู, si aprirà la cartella ป!

Questo spiega perché alcuni altri sviluppatori non hanno avuto alcun problema; il problema non è non-ascii: piuttosto, è un nome file con caratteri componibili. Non tutte le lingue li usano, e anche in lingue che lo fanno, non tutti i nomi di file li hanno.

La buona notizia è che c'è un modo diverso di aprire questi che non presenta questo problema, ovvero descritto da @ bert-huijben in this answer.

Per completezza, ecco la versione simile a quello che ho finito per usare:

[DllImport("shell32.dll", ExactSpelling = true)] 
    public static extern void ILFree(IntPtr pidlList); 

    [DllImport("shell32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] 
    public static extern IntPtr ILCreateFromPathW(string pszPath); 

    [DllImport("shell32.dll", ExactSpelling = true)] 
    public static extern int SHOpenFolderAndSelectItems(IntPtr pidlList, uint cild, IntPtr children, uint dwFlags); 

    public void SelectItemInExplorer(string path) 
    { 
     var pidlList = ILCreateFromPathW(path); 
     if(pidlList == IntPtr.Zero) 
      throw new Exception(string.Format("ILCreateFromPathW({0}) failed",path)); 
     try 
     { 
      Marshal.ThrowExceptionForHR(SHOpenFolderAndSelectItems(pidlList, 0, IntPtr.Zero, 0)); 
     } 
     finally 
     { 
      ILFree(pidlList); 
     } 
    } 
Problemi correlati