Почему CreateFile не удается открыть файл через общий сетевой ресурс? - PullRequest
2 голосов
/ 06 марта 2012

Я написал небольшую программу, которая часто открывает небольшие пользовательские текстовые файлы и до сих пор не сталкивалась с какими-либо проблемами с доступом для чтения / записи или какими-либо конфликтами.Файлы выбираются в другом программном обеспечении, которое я не могу контролировать, и передаются мне в виде строки.

При попытке открыть файл с подключенного сетевого диска появляется сообщение «Система не можетнайти указанный путь "error (GetLastError () = 3).

Вызов показан ниже, *iNCfileName = "z:\\Validation\\Sample Files\\1_1-4 120MM.CC", где Z: сопоставленная папка в нашем домене.

iNCfile = CreateFile( iNCfileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if ( iNCfile == INVALID_HANDLE_VALUE ) 
{
    string msg; // lots of better ways to get this printed ... but ...
    dw = GetLastError();
    msg = iNCfileName;
    msg += ": ";
    msg += _com_error(dw).ErrorMessage();
    print_error(dw , (char*)msg.c_str() );
    return 102;
}

Файл открывается из моей программы, если я копирую его на локальный жесткий диск.Он также открывается в блокноте с подключенного диска.

Может ли это быть проблемой между отображенным представлением "Z: \ what.txt" и истинным именем файла (\ mydomain \ Validation \ S ....??)?

Если это так, как я могу преобразовать один в другой программным способом (предположим, я не буду знать имена доменов / общих ресурсов заранее)?

Если этоИмеет значение, что я использую VS2010, и приложение выполняется на компьютере с Win XP.

Связано: мой следующий вопрос

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Я сталкивался с этим раньше.При использовании пути типа \\DOMAIN\PATH\FILE.TXT мне сначала пришлось позвонить WNetAddConnection2().

Вот мой код (конечно, вы можете исключить членов NULL):

NETRESOURCE nr = {0}; //new structure for network resource
nr.dwType = RESOURCETYPE_ANY; //generic resource (any type allowed)
nr.lpLocalName = NULL; //does not use a device
nr.lpRemoteName = "\\\\DOMAIN\\PATH\\FOLDER"; //For me, this pointed to an account's documents folder, and from there I could use a subfolder
nr.lpProvider = NULL; //no provider

DWORD ret = WNetAddConnection2 (&nr, NULL, NULL, CONNECT_TEMPORARY); //add connection

Не забудьте заголовок и библиотеку.

0 голосов
/ 11 февраля 2017

У меня просто была такая же проблема;попытка создать файл с использованием API CreateFileW на подключенном диске (Z:\folder) не удалась;однако, после изучения этого предмета я попытался создать файл с использованием реального пути (\\Shared_computer_name\folder\), который сразу же успешно работал.

Теперь мне нужно работать с функцией, чтобы получить реальное имя подключенного диска, чтобы использоватьэто когда нужно ... только что нашел WNetGetUniversalName, должен заставить его работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...