Синтаксис Linux fopen () для общего ресурса samba - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь использовать следующий синтаксис для fopen () для доступа к общему ресурсу samba.

FILE *of = fopen("smb://sambadevice/folder/filename.txt", "w");

но это не работает (errno = 2).

Кто-нибудь знает правильный синтаксис для общего ресурса самбы?

PS - если я наберу "smb: // sambadevice / folder" в Dolphin, она откроет папку.

1 Ответ

4 голосов
/ 08 июля 2019

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.

...