2010-11-11 5 views
5

Nella mia applicazione abbiamo requisito in cui dobbiamo eseguire l'operazione System.IO su profondità superiori a 256 caratteri e in questo scenario tutte le API di System.IO non funzionano . usiamo sotto API.Esiste un'API Kernel32 per diverse API System.IO "S

  • System.IO.Path.Combine()
  • System.IO.Path.GetDirectoryName()
  • System.IO.Path.GetFileName()
  • sistema .IO.Path.GetPathRoot()
  • System.IO.Directory.E xists()
  • System.IO.Directory.GetFiles()
  • System.IO.Directory.GetDirectories()
  • System.IO.Directory.CreateDirectory()

favore mi guida, se non v'è alcun sostituto di quanto sopra API disponibile che funziona per più di 256 caratteri,

Grazie!

risposta

0

PI Invoke. Ma potresti non volerlo usare. uhttp: //www.pinvoke.net/default.aspx/kernel32.CreateDirectoryEx

0

Se si utilizza la versione Unicode di GetFullPathName, supporta fino a 32.767 caratteri.

E lo stesso con la funzione CreateFile che può essere utilizzata per creare directory.

Quindi suggerirei di trovare le funzioni adatte pari a File Management Functions e quindi assicurarsi che si stiano utilizzando le versioni Unicode.

Ad esempio, FindFirstFile potrebbe sostituire Exists Suppongo. E combinarlo con FindNextFile per ottenere la funzionalità di GetFiles e GetDirectories

Non si potrebbe trovare un sostituto per Combine perché credo che questo sia un aiutante specifica Net, ma d'altra parte, si dovrebbe essere in grado di scrivere il proprio la sostituzione per questo è abbastanza facile.

3

C'è una grande serie sul Blog BCL squadra per quanto riguarda i percorsi lunghi:

E 'costellata di esempi di come utilizzare l'API Win32 per gestire nomi di file lunghi, come w come tante spiegazioni dei problemi e delle insidie ​​che puoi incontrare. Un esempio è per l'API DeleteFile:

// Taken from "Part 2" of the BCL Team Blog 
using System; 
using System.Runtime.InteropServices; 

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)] 
[return: MarshalAs(UnmanagedType.Bool)] 
internal static extern bool DeleteFile(string lpFileName); 

public static void Delete(string fileName) 
{ 
    string formattedName = @"\\?\" + fileName; 
    DeleteFile(formattedName); 
} 
Problemi correlati