2010-11-11 7 views
5

En mi aplicación tenemos un requisito en el que tenemos que hacer una operación System.IO en profundidad de más de 256 caracteres y en este escenario todas las API de System.IO están fallando . Estamos utilizando debajo de la API.¿Hay una API de Kernel32 para diferentes API de 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()

favor me guía, si hay algún sustituto de la API antes mencionada, que va a trabajar para más de 256 caracteres,

Gracias

Respuesta

0

PI Invocar. Pero puede que no quieras usar eso. uhttp: //www.pinvoke.net/default.aspx/kernel32.CreateDirectoryEx

0

Si utiliza la versión Unicode de GetFullPathName, admite hasta 32.767 caracteres.

Y lo mismo con la función CreateFile que se puede usar para crear directorios.

Así que sugiero simplemente encontrar las funciones adecuadas cantidad File Management Functions y luego asegurarse de que está utilizando las versiones Unicode. Por ejemplo, FindFirstFile podría reemplazar Supongo. Y combinarla con FindNextFile para obtener la funcionalidad de GetFiles y GetDirectories

Es posible que no encontrar un reemplazo para Combine ya que creo que eso es una ayuda específica .Net, pero por el contrario, debe ser capaz de escribir su propio reemplazo para eso bastante fácil.

3

Hay una gran serie en el blog de BCL Equipo referente a las vías largas:

Está llena de ejemplos de cómo utilizar la API Win32 para manejar nombres largos de archivos, como w Como explicación suficiente de los problemas y dificultades que puede encontrar. Un ejemplo es para la 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); 
} 
Cuestiones relacionadas