using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;

namespace Addison_Wesley.Codebook.Filesystem
{
   public class FileUtil
   {
      /* Deklarace potřebných funkcí a konstant z API */
      [DllImport("kernel32.dll", SetLastError = true)]
      private static extern int GetShortPathName(string lpszLongPath,
         StringBuilder lpszShortPath, int cchBuffer);

      [DllImport("Kernel32.dll")]
      private static extern int FormatMessage(int dwFlags, string lpSource,
         int dwMessageId, int dwLanguageId, StringBuilder lpBuffer, int nSize,
         string[] Arguments);

      private const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000;
      private const int MAX_PATH = 260;

      /// <summary>
      /// Zjistí krátké jméno souboru (8.3-)
      /// </summary>
      /// <param name="filePath">Cesta k souboru</param>
      /// <returns>Vrátí krátké jméno souboru</returns>
      public static string GetShortName(string filePath)
      {
         // Zavoláme GetShortPathName dostatečně velkým 
         // objektem typu StringBuilder 
         StringBuilder shortName = new StringBuilder(MAX_PATH + 1);
         if (GetShortPathName(filePath, shortName, MAX_PATH + 1) > 0)
         {
            return shortName.ToString();
         }
         else
         {
            // Běhová chyba: Zjistíme chybu API, k ní odpovídající popis
            // a s ním vyvoláme výjimku
            System.Text.StringBuilder errorMessage = new StringBuilder(1024);
            FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, null,
               Marshal.GetLastWin32Error(), 0, errorMessage, 1024, null);
            throw new IOException(errorMessage.ToString());
         }
      }
   }
}
