|
dev
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
pinvoke GetDiskFreeSpaceEx with UNCI am using VS 2005, .Net 2.0., Windows XP Pro SP2 I encountered a problem for which I couldn't find answer in google. I want to get colume size information - total, free and available. I am using GetDiskFreeSpaceEx API function to do this. So far, so good. Specification says that this function returns BOOL with 0 on failure, nonzero on success. I took code posted on http://www.experts-exchange.com/Programming/Programming_Languages/C_Sharp/Q_21447681.html (thanks!) and after slight modification i can use it, yet there is problem with result: if called disk is local, the result equals to 1, if the disk is an UNC path the result is big, but returned values seem to be ok, and if the path doesn't exist, the result is huge (long), returned values equal to 0. I check also Marshall.GetLastWin32Error() and it ALWAYS is non zero - here are examples: under debugger (F5) c:\, free space: 3051442176, result: 1, error >>5<< desc: Access is denied _______________________________________________________________ \\pg11\c$, free space: 28002582528, result: 25769803777, error >>5<< desc: Acces s is denied _______________________________________________________________ aargh, free space: 0, result: 75998243711877120, error >>3<< desc: The system ca nnot find the path specified _______________________________________________________________ c:\, free space: 3051442176, result: 1, error >>3<< desc: The system cannot find the path specified _______________________________________________________________ \\pg11\c$, free space: 28002582528, result: 25769803777, error >>3<< desc: The s ystem cannot find the path specified _______________________________________________________________ aargh, free space: 0, result: 76842668642009088, error >>3<< desc: The system ca nnot find the path specified _______________________________________________________________ Start without debugging (Ctrl-F5) c:\, free space: 3051438080, result: 1, error >>2<< desc: The system cannot find the file specified _______________________________________________________________ \\pg11\c$, free space: 28002582528, result: 25769803777, error >>1004<< desc: Invalid flags _______________________________________________________________ aargh, free space: 0, result: 33495522228568064, error >>3<< desc: The system cannot find the path specified _______________________________________________________________ c:\, free space: 3051438080, result: 1, error >>3<< desc: The system cannot find the path specified _______________________________________________________________ \\pg11\c$, free space: 28002582528, result: 25769803777, error >>3<< desc: The system cannot find the path specified _______________________________________________________________ aargh, free space: 0, result: 34339947158700032, error >>3<< desc: The system cannot find the path specified _______________________________________________________________ It is worth to see that after 'aaargh' 'directory' :) the last error always shows 'The system cannot find the path specified'. I'd expect that result should be 0 in this case so I could thow an exception. Anyone has any idea? :) Peter Here is my sample code: using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { try { DriveInfo.GetInfo("c:\\"); DriveInfo.GetInfo("\\\\pg11\\c$"); DriveInfo.GetInfo("aargh"); DriveInfo.GetInfo("c:\\"); DriveInfo.GetInfo("\\\\pg11\\c$"); DriveInfo.GetInfo("aargh"); } catch (Exception e) { Console.WriteLine("An error occured during operation:\n " + e.ToString()); } Console.ReadKey(); } } /// <summary> /// Contains methods to retrieve capacity information for disks or UNC paths /// </summary> public sealed class DriveInfo { [DllImport("kernel32.dll", EntryPoint = "GetDiskFreeSpaceExW", CharSet=CharSet.Unicode, SetLastError=true)] private static extern long GetDiskFreeSpaceEx(string lpDirectoryName, out long lpFreeBytesAvailableToCaller, out long lpTotalNumberOfBytes, out long lpTotalNumberOfFreeBytes); /// <summary> /// Returns amount of available, total and free space for given disk /// <para>Disk may be specified as 'd:' or '\\server\disk$'</para> /// </summary> /// <param name="drive"></param> /// <param name="available"></param> /// <param name="total"></param> /// <param name="free"></param> /// <returns></returns> public static long GetInfo(string drive, out long available, out long total, out long free) { long result = GetDiskFreeSpaceEx(drive, out available, out total, out free); if (result!= 1) throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); return result; } /// <summary> /// Returns amount of available, total and free space for given disk /// <para>Disk may be specified as 'd:' or '\\server\disk$'</para> /// The information is returned in <see cref="DriveInfoSystem"/> structure /// </summary> /// <param name="drive"></param> /// <returns></returns> public static DriveInfoSystem GetInfo(string drive) { long result = 0, available = 0, total = 0, free = 0; result = GetDiskFreeSpaceEx(drive, out available, out total, out free); //Debug only int nError = Marshal.GetLastWin32Error(); Console.WriteLine(drive + ", free space: " + free.ToString() + ", result: " + result.ToString() + ", error >>" + nError.ToString() + "<< desc: " + new System.ComponentModel.Win32Exception(nError).Message + "\n_______________________________________________________________"); //end //if (result != 1) // throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); return new DriveInfoSystem(drive, result, available, total, free); } } /// <summary> /// Stores values returned by <see cref="GetInfo"/> method of <see cref="DriveInfo"/> object /// </summary> public struct DriveInfoSystem { public readonly string Drive; private readonly long Result; private readonly long Available; private readonly long Total; private readonly long Free; /// <summary> /// Returns free space in megabytes /// </summary> public double FreeMB { get { return Free / 1024.0 / 1024.0; } } /// <summary> /// Returns available space in megabytes /// </summary> public double AvailableMB { get { return Available / 1024.0 / 1024.0; } } /// <summary> /// Returns total size in megabytes /// </summary> public double TotalMB { get { return Total / 1024.0 / 1024.0; } } public DriveInfoSystem(string drive, long result, long available, long total, long free) { this.Drive = drive; this.Result = result; this.Available = available; this.Total = total; this.Free = free; } } } UNC paths must end with a \
But you have other issues as well (error 5 - access denied), but without seeing any code it's quite impossible to help you out with this. Willy. "Rogas69" <rogas69@no_spamers.o2.ie> wrote in message http://www.experts-exchange.com/Programming/Programming_Languages/C_Sharp/Q_21447681.htmlnews:OpaxgHoUGHA.4452@TK2MSFTNGP12.phx.gbl... | Hi all, | | I am using VS 2005, .Net 2.0., Windows XP Pro SP2 | | I encountered a problem for which I couldn't find answer in google. | I want to get colume size information - total, free and available. I am | using GetDiskFreeSpaceEx API function to do this. | So far, so good. Specification says that this function returns BOOL with 0 | on failure, nonzero on success. | I took code posted on | Show quote | (thanks!) System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());| and after slight modification i can use it, yet there is problem with | result: if called disk is local, the result equals to 1, if the disk is an | UNC path the result is big, but returned values seem to be ok, and if the | path doesn't exist, the result is huge (long), returned values equal to 0. | I check also Marshall.GetLastWin32Error() and it ALWAYS is non zero - here | are examples: | under debugger (F5) | c:\, free space: 3051442176, result: 1, error >>5<< desc: Access is denied | _______________________________________________________________ | \\pg11\c$, free space: 28002582528, result: 25769803777, error >>5<< desc: | Acces | s is denied | _______________________________________________________________ | aargh, free space: 0, result: 75998243711877120, error >>3<< desc: The | system ca | nnot find the path specified | _______________________________________________________________ | c:\, free space: 3051442176, result: 1, error >>3<< desc: The system cannot | find | the path specified | _______________________________________________________________ | \\pg11\c$, free space: 28002582528, result: 25769803777, error >>3<< desc: | The s | ystem cannot find the path specified | _______________________________________________________________ | aargh, free space: 0, result: 76842668642009088, error >>3<< desc: The | system ca | nnot find the path specified | _______________________________________________________________ | | | Start without debugging (Ctrl-F5) | c:\, free space: 3051438080, result: 1, error >>2<< desc: The system cannot | find the file specified | _______________________________________________________________ | \\pg11\c$, free space: 28002582528, result: 25769803777, error >>1004<< | desc: Invalid flags | _______________________________________________________________ | aargh, free space: 0, result: 33495522228568064, error >>3<< desc: The | system cannot find the path specified | _______________________________________________________________ | c:\, free space: 3051438080, result: 1, error >>3<< desc: The system cannot | find the path specified | _______________________________________________________________ | \\pg11\c$, free space: 28002582528, result: 25769803777, error >>3<< desc: | The system cannot find the path specified | _______________________________________________________________ | aargh, free space: 0, result: 34339947158700032, error >>3<< desc: The | system cannot find the path specified | _______________________________________________________________ | | | It is worth to see that after 'aaargh' 'directory' :) the last error always | shows 'The system cannot find the path specified'. I'd expect that result | should be 0 in this case so I could thow an exception. | | Anyone has any idea? :) | | Peter | | Here is my sample code: | | | using System; | | using System.Collections.Generic; | | using System.Text; | | using System.Runtime.InteropServices; | | namespace ConsoleApplication1 | | { | | class Program | | { | | static void Main(string[] args) | | { | | try | | { | | DriveInfo.GetInfo("c:\\"); | | DriveInfo.GetInfo("\\\\pg11\\c$"); | | DriveInfo.GetInfo("aargh"); | | DriveInfo.GetInfo("c:\\"); | | DriveInfo.GetInfo("\\\\pg11\\c$"); | | DriveInfo.GetInfo("aargh"); | | } | | catch (Exception e) | | { | | Console.WriteLine("An error occured during operation:\n " + e.ToString()); | | } | | Console.ReadKey(); | | } | | } | | /// <summary> | | /// Contains methods to retrieve capacity information for disks or UNC paths | | /// </summary> | | public sealed class DriveInfo | | { | | [DllImport("kernel32.dll", EntryPoint = "GetDiskFreeSpaceExW", | CharSet=CharSet.Unicode, SetLastError=true)] | | private static extern long GetDiskFreeSpaceEx(string lpDirectoryName, | | out long lpFreeBytesAvailableToCaller, | | out long lpTotalNumberOfBytes, | | out long lpTotalNumberOfFreeBytes); | | /// <summary> | | /// Returns amount of available, total and free space for given disk | | /// <para>Disk may be specified as 'd:' or '\\server\disk$'</para> | | /// </summary> | | /// <param name="drive"></param> | | /// <param name="available"></param> | | /// <param name="total"></param> | | /// <param name="free"></param> | | /// <returns></returns> | | public static long GetInfo(string drive, out long available, out long total, | out long free) | | { | | long result = GetDiskFreeSpaceEx(drive, out available, out total, out free); | | if (result!= 1) | | throw new Show quote | | return result; | | } | | | | /// <summary> | | /// Returns amount of available, total and free space for given disk | | /// <para>Disk may be specified as 'd:' or '\\server\disk$'</para> | | /// The information is returned in <see cref="DriveInfoSystem"/> structure | | /// </summary> | | /// <param name="drive"></param> | | /// <returns></returns> | | public static DriveInfoSystem GetInfo(string drive) | | { | | long result = 0, available = 0, total = 0, free = 0; | | result = GetDiskFreeSpaceEx(drive, out available, out total, out free); | | //Debug only | | int nError = Marshal.GetLastWin32Error(); | | Console.WriteLine(drive + ", free space: " + free.ToString() + | | ", result: " + result.ToString() + ", error >>" + | | nError.ToString() + "<< desc: " + | | new System.ComponentModel.Win32Exception(nError).Message + | | "\n_______________________________________________________________"); | | //end | | //if (result != 1) | | // throw new | System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); | | return new DriveInfoSystem(drive, result, available, total, free); | | } | | } | | /// <summary> | | /// Stores values returned by <see cref="GetInfo"/> method of <see | cref="DriveInfo"/> object | | /// </summary> | | public struct DriveInfoSystem | | { | | public readonly string Drive; | | private readonly long Result; | | private readonly long Available; | | private readonly long Total; | | private readonly long Free; | | /// <summary> | | /// Returns free space in megabytes | | /// </summary> | | public double FreeMB { get { return Free / 1024.0 / 1024.0; } } | | /// <summary> | | /// Returns available space in megabytes | | /// </summary> | | public double AvailableMB { get { return Available / 1024.0 / 1024.0; } } | | /// <summary> | | /// Returns total size in megabytes | | /// </summary> | | public double TotalMB { get { return Total / 1024.0 / 1024.0; } } | | public DriveInfoSystem(string drive, long result, long available, long | total, long free) | | { | | this.Drive = drive; | | this.Result = result; | | this.Available = available; | | this.Total = total; | | this.Free = free; | | } | | } | | } | | | well I provided you all code :) down there :)
Show quote > | > | > | using System; > | > | using System.Collections.Generic; > | > | using System.Text; > | > | using System.Runtime.InteropServices; > | > | namespace ConsoleApplication1 > | > | { > | > | class Program > | > | { > | > | static void Main(string[] args) > | > | { > | > | try > | > | { > | > | DriveInfo.GetInfo("c:\\"); > | > | DriveInfo.GetInfo("\\\\pg11\\c$"); > | > | DriveInfo.GetInfo("aargh"); > | > | DriveInfo.GetInfo("c:\\"); > | > | DriveInfo.GetInfo("\\\\pg11\\c$"); > | > | DriveInfo.GetInfo("aargh"); > | > | } > | > | catch (Exception e) > | > | { > | > | Console.WriteLine("An error occured during operation:\n " + > e.ToString()); > | > | } > | > | Console.ReadKey(); > | > | } > | > | } > | > | /// <summary> > | > | /// Contains methods to retrieve capacity information for disks or UNC > paths > | > | /// </summary> > | > | public sealed class DriveInfo > | > | { > | > | [DllImport("kernel32.dll", EntryPoint = "GetDiskFreeSpaceExW", > | CharSet=CharSet.Unicode, SetLastError=true)] > | > | private static extern long GetDiskFreeSpaceEx(string lpDirectoryName, > | > | out long lpFreeBytesAvailableToCaller, > | > | out long lpTotalNumberOfBytes, > | > | out long lpTotalNumberOfFreeBytes); > | > | /// <summary> > | > | /// Returns amount of available, total and free space for given disk > | > | /// <para>Disk may be specified as 'd:' or '\\server\disk$'</para> > | > | /// </summary> > | > | /// <param name="drive"></param> > | > | /// <param name="available"></param> > | > | /// <param name="total"></param> > | > | /// <param name="free"></param> > | > | /// <returns></returns> > | > | public static long GetInfo(string drive, out long available, out long > total, > | out long free) > | > | { > | > | long result = GetDiskFreeSpaceEx(drive, out available, out total, out > free); > | > | if (result!= 1) > | > | throw new > System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); > | > | return result; > | > | } > | > | > | > | /// <summary> > | > | /// Returns amount of available, total and free space for given disk > | > | /// <para>Disk may be specified as 'd:' or '\\server\disk$'</para> > | > | /// The information is returned in <see cref="DriveInfoSystem"/> > structure > | > | /// </summary> > | > | /// <param name="drive"></param> > | > | /// <returns></returns> > | > | public static DriveInfoSystem GetInfo(string drive) > | > | { > | > | long result = 0, available = 0, total = 0, free = 0; > | > | result = GetDiskFreeSpaceEx(drive, out available, out total, out free); > | > | //Debug only > | > | int nError = Marshal.GetLastWin32Error(); > | > | Console.WriteLine(drive + ", free space: " + free.ToString() + > | > | ", result: " + result.ToString() + ", error >>" + > | > | nError.ToString() + "<< desc: " + > | > | new System.ComponentModel.Win32Exception(nError).Message + > | > | "\n_______________________________________________________________"); > | > | //end > | > | //if (result != 1) > | > | // throw new > | System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); > | > | return new DriveInfoSystem(drive, result, available, total, free); > | > | } > | > | } > | > | /// <summary> > | > | /// Stores values returned by <see cref="GetInfo"/> method of <see > | cref="DriveInfo"/> object > | > | /// </summary> > | > | public struct DriveInfoSystem > | > | { > | > | public readonly string Drive; > | > | private readonly long Result; > | > | private readonly long Available; > | > | private readonly long Total; > | > | private readonly long Free; > | > | /// <summary> > | > | /// Returns free space in megabytes > | > | /// </summary> > | > | public double FreeMB { get { return Free / 1024.0 / 1024.0; } } > | > | /// <summary> > | > | /// Returns available space in megabytes > | > | /// </summary> > | > | public double AvailableMB { get { return Available / 1024.0 / > 1024.0; } } > | > | /// <summary> > | > | /// Returns total size in megabytes > | > | /// </summary> > | > | public double TotalMB { get { return Total / 1024.0 / 1024.0; } } > | > | public DriveInfoSystem(string drive, long result, long available, long > | total, long free) > | > | { > | > | this.Drive = drive; > | > | this.Result = result; > | > | this.Available = available; > | > | this.Total = total; > | > | this.Free = free; > | > | } > | > | } > | > | } > | > | > | > > |
|||||||||||||||||||||||