Я пытаюсь использовать следующий синтаксис для fopen() для доступа к общему ресурсу samba.
FILE *of = fopen("smb://sambadevice/folder/filename.txt", "w");
но это не работает (errno = 2).
Кто-нибудь знает правильный синтаксис для доли самбы?
PS - если я наберу "smb://sambadevice/folder" в Dolphin, он откроет папку.
Спасибо @Ian Abbott за это понимание.
Раньше (я больше не использую KDE) я использовал Smb4K для подключения общих ресурсов SMB в KDE. Это все еще, кажется, поддерживается, так что стоит изучить.
когда вызов fopen() терпит неудачу (возвращает NULL), то следует немедленно вызвать perror(), поэтому текст, по которому система считает, что произошла ошибка, выводится в stderr





fopen не понимает синтаксис Любые. Нет никаких специальных форм имени файла, которые вы можете передать, чтобы получить доступ к чему-то особенному, не что иное, как обычный путь имени файла в (что кажется) локальной файловой системе.
Когда вы передаете путь к fopen, обычно он никаким образом не анализирует и не проверяет строку пути; он просто передает его базовому системному вызову open. И затем open не делает ничего, кроме очень простого синтаксического анализа пути: все, что он делает, это разбивает его на / символов, чтобы он мог пройти путь (пройти через любые каталоги и подкаталоги), чтобы найти запрошенный файл . Это соответствует важному постулату философии Unix, а именно «все есть файл».
Однако это абсолютно означает, что нет означает, что нет никакого способа получить доступ к смонтированным Samba файловым ресурсам с помощью программы C, которая вызывает fopen. Если вы хотите получить доступ к файловым ресурсам, смонтированным на Samba, вам нужно выяснить, как их устанавливать в локальной файловой системе. Есть много способов сделать это. Я использую команду mount.cifs. Люди в комментариях также упоминали GVfs, KioFuse и Smb4K.
После того, как вы смонтировали общий файловый ресурс Samba (или, аналогичным образом, смонтировали ресурс Любые), как если бы это был файл или каталог в локальной файловой системе, вы можете получить доступ через его путь, как если бы -- ну, как если бы это был файл или каталог в локальной файловой системе. (И, конечно же, вы можете получить к нему доступ через любой инструмент или приложение, независимо от того, вызывает ли это программу на C fopen.)
Таким образом, в системе Unix или Linux вы обычно не увидите явного синтаксиса smb:// в открываемом пути. Обычно путь, который вы открываете, начинается с /mnt, /cifs или /home/myname/.gvfs, то есть где бы в файловой системе не был смонтирован общий ресурс Samba.
Как правило, в Linux для автоматического монтирования общих ресурсов smb в каталоге /cifs используется autofs, поэтому можно использовать путь типа «/cifs/sambadevice/folder/filename.txt». В большинстве дистрибутивов Linux поддержка autofs/smb отключена по умолчанию, поскольку это имеет некоторые последствия для безопасности (если вы не доверяете другим устройствам в локальной сети, это несколько небезопасно).
fopenи базовыйopenработают только с файлами в смонтированных файловых системах. Они не понимают URL-адреса SMB. GNOME имеет GVfs для локального монтирования удаленных файловых систем, таких как общие ресурсы SMB, в качестве подкаталога${XDG_RUNTIME_DIR}/gvfs. Эквивалентом KDE является КиоФьюз, но работа над ним еще не завершена.