Получить информацию о томах

499
28 ноября 2016, 18:35

Как узнать, существует тот или другой том? Например, мне нужно сделать так:

  • если существует диск D, то создать файлы там;
  • если нет, то создать файлы на диске C.
Answer 1

Самый простой способ - просто попробовать создать нужный файл (предварительно проверив его существование - чтоб чего не затереть случайно...)

Иначе надо использовать средства конкретной операционной системы, потому что в самом C++ такого понятия как том просто нет. Как нет его и в ряде операционных систем :)

Вот как это рекомендуется делать в Windows:

#include <stdio.h>  
#include <direct.h>  
#include <stdlib.h>  
#include <ctype.h>  
int main( void )  
{  
   int drive, curdrive;
   static char path[_MAX_PATH];  
   // Save current drive.  
   curdrive = _getdrive();  
   printf( "Available drives are:\n" );  
   // If we can switch to the drive, it exists.  
   for( drive = 1; drive <= 26; drive++ )  
   {  
      if( !_chdrive( drive ) )  
      {  
         printf( "%c:", drive + 'A' - 1 );  
         if( _getdcwd( drive, path, _MAX_PATH ) != NULL )  
            printf( " (Current directory is %s)", path );  
         putchar( '\n' );  
      }  
   }  
   // Restore original drive.  
   _chdrive( curdrive );  
}
Answer 2

Имея поддержку c++17 (или даже c++14 с экспериментальной частью) можно использовать следующий код для проверки наличия того или иного диска, основанный на библиотеке filesystem:

#include <iostream>
#include <string>
#include <filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
    for( char drive = 'a'; drive <= 'z'; ++drive ) 
    {
        fs::path p = std::string(1, drive) + ":";
        std::cout << std::boolalpha << p << " - " << fs::exists(p) << "\n";
    }
}
Answer 3

Есть очень гуманный способ:

int n;
char dd[4];
DWORD dr = GetLogicalDrives();
for( int i = 0; i < 26; i++ )
{
    n = ((dr>>i)&0x00000001);
    if( n == 1 ){
        dd[0] = char(65+i); dd[1] = ':'; dd[2] = '\\'; dd[3] = 0;
        cout << "Available disk drives : " << dd << endl;
    }
}
READ ALSO
Почему не работает функция applyForce?

Почему не работает функция applyForce?

Начал изучать cocos2d-x,но столкнулся с тем, что у меня не работают функции applyForce(), apllyImpulse(), applyTorque()Пытался гуглить, но подобной проблему...

451
Автоматическое разделение на страницы HTML содержимого

Автоматическое разделение на страницы HTML содержимого

Собственно задача такова - отобразить HTML документ в виде одной или нескольких страниц A4 (зависит от документа)Нужно для печати и окна предварительного...

509
Как узнать номер порта по которому подключился клиент к серверу

Как узнать номер порта по которому подключился клиент к серверу

Добрый вечер! Подскажите это узнатьИспользую библиотеки Winsock2 и Ws2tcpip

452
rebyta po bistrya [требует правки]

rebyta po bistrya [требует правки]

Множество из N (N <= 1000) прямоугольных параллелепипедов задано измерениями этих параллелепипедов (длина и ширина основания, высота)Нужно...

524