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

namespace Addison_Wesley.Codebook.Filesystem
{
   public class FileUtils
   {
      /// <summary>
      /// Deklarace funkce GetWindowsDirectory z API
      /// </summary>
      [DllImport("kernel32.dll", SetLastError = true)]
      private static extern uint GetWindowsDirectory(StringBuilder lpBuffer,
         uint uSize);

      /// <summary>
      /// Vyhledá soubor na systémových cestách
      /// </summary>
      /// <param name="fileName">Jméno souboru</param>
      /// <returns>Vrací cestu souboru, byl-li nalezen, jinak vrací null.</returns>
      public static string FindFileInSystemPaths(string fileName)
      {
         string path = null;

         // Hledání v systémovém adresáři Windows
         path = Path.Combine(Environment.SystemDirectory, fileName);
         if (File.Exists(path))
         {
            return path;
         }

         // Hledání v adresáři Windows
         const int MAX_PATH = 160;
         string windowsDirectoryName = null;
         StringBuilder buffer = new StringBuilder(MAX_PATH + 1);
         if (GetWindowsDirectory(buffer, 260) > 0)
         {
            windowsDirectoryName = buffer.ToString();
            path = Path.Combine(windowsDirectoryName, fileName);
            if (File.Exists(path))
            {
               return path;
            }
         }

         // Hledání v adresářích, které jsou v systémové
         // proměnné Path
         string[] systemPaths = Environment.GetEnvironmentVariable(
            "path").Split(new char[] { ';' });
         for (int i = 0; i < systemPaths.Length; i++)
         {
            // Proměnná Path může také obsahovat uvozovky,
            // které je třeba odstranit (cesta obsahující 
            // mezeru může být v uvozovkách). Odstraňují se 
            // také úvodní a koncové mezery
            path = Path.Combine(systemPaths[i].Trim().Trim(new char[] {'\"'}), fileName);
            if (File.Exists(path))
            {
               return path;
            }
         }

         return null;
      }
   }
}
