Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > метка диска по сетевому имени


Автор: Domain 12.5.2010, 10:09
Всем привет. Как мне например по сетевому пути \\Gdm-alex\Install  узнать метку диска в котором находится каталог install. узнать информацию о этом диске:размер, свободное место и т.д. на я использовал DiskSize и DiskFree, но это если папка лежит на самом компьютере. а как быть если путь к папке по сети даже и не представляю..

Автор: Domain 12.5.2010, 21:19
хм. никто не знает или меня просто игнорируют)))?

Автор: Alca 12.5.2010, 21:30
http://msdn.microsoft.com/en-us/library/aa364993(VS.85).aspx ?

Добавлено @ 21:37
Цитата

Код

BOOL WINAPI GetVolumeInformation(
  __in_opt   LPCTSTR lpRootPathName,
  __out      LPTSTR lpVolumeNameBuffer,
  __in       DWORD nVolumeNameSize,
  __out_opt  LPDWORD lpVolumeSerialNumber,
  __out_opt  LPDWORD lpMaximumComponentLength,
  __out_opt  LPDWORD lpFileSystemFlags,
  __out      LPTSTR lpFileSystemNameBuffer,
  __in       DWORD nFileSystemNameSize
);


lpRootPathName [in, optional] 

A pointer to a string that contains the root directory of the volume to be described.

If this parameter is NULL, the root of the current directory is used. A trailing backslash is required. For example, you specify \\MyServer\MyShare as "\\MyServer\MyShare\", or the C drive as "C:\".

Автор: Domain 12.5.2010, 22:11
а пример использования можно? а то я с msdn не силен.

Автор: Alca 12.5.2010, 22:18
Код

#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))

TCHAR volumeName[MAX_PATH + 1] = { 0 };
TCHAR fileSystemName[MAX_PATH + 1] = { 0 };
DWORD serialNumber = 0;
DWORD maxComponentLen = 0;
DWORD fileSystemFlags = 0;
if (GetVolumeInformation(
        _T("C:\\"),
        volumeName,
        ARRAYSIZE(volumeName),
        &serialNumber,
        &maxComponentLen,
        &fileSystemFlags,
        fileSystemName,
        ARRAYSIZE(fileSystemName)))
{
    _tprintf(_T("Volume Name: %s\n"), volumeName);
    _tprintf(_T("Serial Number: %lu\n"), serialNumber);
    _tprintf(_T("File System Name: %s\n"), fileSystemName);
    _tprintf(_T("Max Component Length: %lu\n"), maxComponentLen);
}

Автор: Domain 13.5.2010, 18:16
Короче есть код. Получаю не то, что надо. где ошибка?

Код

BOOL TForm1::GetVolumeInformation(
  LPCTSTR lpRootPathName,
  LPTSTR lpVolumeNameBuffer,
  DWORD nVolumeNameSize,
  LPDWORD lpVolumeSerialNumber,
  LPDWORD lpMaximumComponentLength,
  LPDWORD lpFileSystemFlags,
  LPTSTR lpFileSystemNameBuffer,
  DWORD nFileSystemNameSize )
  { Label1->Caption=IntToStr(lpVolumeSerialNumber);
    Label2->Caption=lpRootPathName;
    Label3->Caption=lpVolumeNameBuffer;
    Label4->Caption=nFileSystemNameSize ;
  }

void __fastcall TForm1::Button1Click(TObject *Sender)
{

 LPCTSTR RootPathName = "\\Deathmashine1\\MUSIC\\";
 LPTSTR VolumeNameBuffer;
 DWORD nVolumeNameSize = 256;
 LPDWORD nVolumeSerialNumber = 0;
 LPDWORD MaximumComponentLength = 0;
 LPDWORD FileSystemFlags = 0;
 LPTSTR  FileSystemNameBuffer = 0;
 DWORD   FileSystemNameSize = 256;
 GetVolumeInformation(RootPathName,VolumeNameBuffer,nVolumeNameSize,VolumeSerialNumber,
 MaximumComponentLength,FileSystemFlags,FileSystemNameBuffer,FileSystemNameSize);

Автор: Alca 13.5.2010, 20:50
Код

LPCTSTR RootPathName = _T("\\Deathmashine1\\MUSIC\\");

Автор: Domain 13.5.2010, 23:30
компилятор на _T ругается...

Автор: Alca 13.5.2010, 23:36
Код

#include <tchar.h>

Автор: Domain 14.5.2010, 09:17
так а из какой переменной потом брать размер диска. я пробовал все и кроме 1, 0, 261.  я ничего не получаю. Alca Юзал твой код.
Код

BOOL TForm1::GetVolumeInformation(
  LPCTSTR lpRootPathName,
  LPTSTR lpVolumeNameBuffer,
  DWORD nVolumeNameSize,
  LPDWORD lpVolumeSerialNumber,
  LPDWORD lpMaximumComponentLength,
  LPDWORD lpFileSystemFlags,
  LPTSTR lpFileSystemNameBuffer,
  DWORD nFileSystemNameSize )
  {
   Label1->Caption= nFileSystemNameSize;
  }

void __fastcall TForm1::Button1Click(TObject *Sender)
{
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
TCHAR volumeName[MAX_PATH + 1] = { 0 };
TCHAR fileSystemName[MAX_PATH + 1] = { 0 };
DWORD serialNumber = 0;
DWORD maxComponentLen = 0;
DWORD fileSystemFlags = 0;
if (GetVolumeInformation(
        _T("\\\\Gdm-alex\\Install\\"),
        volumeName,
        ARRAYSIZE(volumeName),
        &serialNumber,
        &maxComponentLen,
        &fileSystemFlags,
        fileSystemName,
        ARRAYSIZE(fileSystemName)));
        //Label1->Caption=maxComponentLen;

}


Что-то скорее всего не так.

Автор: Alca 14.5.2010, 09:35
Цитата

так а из какой переменной потом брать размер диска. 

 smile 
Цитата

я пробовал все и кроме 1, 0, 261.  

 smile 
Вопрос кажись был про метку диска???????  smile

Добавлено через 1 минуту и 24 секунды
Цитата

а как быть если путь к папке по сети даже и не представляю..

Цитата

GetVolumeInformation() requires an extra backslash with UNC names, so that the name has the form \\<SERVER>\<SHARE>\.

Автор: xvr 14.5.2010, 11:41
Цитата(Domain @ 13.5.2010,  18:16)
Короче есть код. Получаю не то, что надо. где ошибка?

Код

BOOL TForm1::GetVolumeInformation(
  LPCTSTR lpRootPathName,
  LPTSTR lpVolumeNameBuffer,
  DWORD nVolumeNameSize,
  LPDWORD lpVolumeSerialNumber,
  LPDWORD lpMaximumComponentLength,
  LPDWORD lpFileSystemFlags,
  LPTSTR lpFileSystemNameBuffer,
  DWORD nFileSystemNameSize )
  { Label1->Caption=IntToStr(lpVolumeSerialNumber);
    Label2->Caption=lpRootPathName;
    Label3->Caption=lpVolumeNameBuffer;
    Label4->Caption=nFileSystemNameSize ;
  }

Это сильно, это 5  smile Не надо в форме делать GetVolumeInformation (и особенно в таком виде), она уже есть в системе  smile 

Автор: Domain 14.5.2010, 19:22
Цитата

узнать информацию о этом диске:размер, свободное место и т.д

Внимательнее будьте. так к какому выводу мы пришли? Размер я не узнаю. И то есть код тоже как бы верный, только принять стоит во внимание что сказал  xvr. Так я понимаю?

Добавлено через 8 минут и 28 секунд
Код

 __int64 Total;
 __int64 Free;
 __int64 Avail;
 GetDiskFreeSpaceExA("\\\\Deathmashine1\\Downloads\\", reinterpret_cast<ULARGE_INTEGER*>(&Avail),
                             reinterpret_cast<ULARGE_INTEGER*>(&Total),
                             reinterpret_cast<ULARGE_INTEGER*>(&Free));
 // Ïîêàçàòü ðàçìåð äèñêà â áàéòàõ
 ShowMessage(IntToStr(Total));


показывает размер диска. код рабочий.

Автор: Domain 14.5.2010, 19:57
в free будет свободное место на диске я так понял

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)