Метод преобразования длинного имени пути в короткий путь возвращает ноль - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь убедиться, что могу загрузить файл, если он имеет длинное имя.Это класс, который я использую.

public class ShortFileName
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern int GetShortPathName(
    [MarshalAs(UnmanagedType.LPTStr)]
    string path,
    [MarshalAs(UnmanagedType.LPTStr)]
    StringBuilder shortPath,
    int shortPathLength
    );
}

Это код в моем контроллере, который осуществляет загрузку.

 public ActionResult Download(string path, string fileName)
    {
        try
        {
            StringBuilder shortPath = new StringBuilder(255);

            ShortFileName.GetShortPathName(path, shortPath, shortPath.Capacity);

            byte[] fileBytes = System.IO.File.ReadAllBytes(shortPath.ToString());

            return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
        }
        catch (Exception)
        {
            throw;
        }

    }

shortPath имеет значение NULL, если путь к файлу слишком длинный.

1 Ответ

0 голосов
/ 11 июня 2018

Это должно работать.Если вам не нужно поддерживать исходные имена путей длиннее 260 символов, вы можете удалить весь код, связанный с PREFIX.

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern uint GetShortPathName(
    [MarshalAs(UnmanagedType.LPTStr)]
    string lpszLongPath,
    [MarshalAs(UnmanagedType.LPTStr)]
    StringBuilder lpszShortPath,
    uint cchBuffer);

public static string ShortFilenameFor(string longFilename)
{
    // Add to the long filename a prefix to cause the API to handle filenames longer than 260 characters.

    const string PREFIX = @"\\?\";
    longFilename = PREFIX + longFilename;

    // First check how much space is required for the short filename.

    uint length = GetShortPathName(longFilename, null, 0);

    if (length == 0)
        throw new Win32Exception(Marshal.GetLastWin32Error());

    // Now allocate buffer of the correct length and fill it.

    StringBuilder buffer = new StringBuilder((int)length);
    uint result = GetShortPathName(longFilename, buffer, length);

    if (result == 0)
        throw new Win32Exception(Marshal.GetLastWin32Error());

    buffer.Remove(0, PREFIX.Length);
    return buffer.ToString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...