# Writing file system plugins for Double Commander

Description | Structures | Functions and Procedures | Types | Constants

## Description

This help file is about writing file system plugins for Double Commander.

### Functions and Procedures

`HANDLE __stdcall VfsOpen(char* Path);```
`void __stdcall VfsClose(HANDLE` `hInstance``);``` ``
`BOOL __stdcall VfsFindFirst(``HANDLE` `hInstance,` `char* Path,` `VFS_FIND_DATA*``FindData);```
`BOOL __stdcall VfsFindNext(``HANDLE` `hInstance,` `VFS_FIND_DATA* FindData``);``` ``
`void __stdcall VfsFindClose(````HANDLE` `hInstance,` `VFS_FIND_DATA* FindData````);```
`int __stdcall VfsMoveFile(``HANDLE hInstance, char* OldName, char* NewName, int CopyFlags``````);``` ``
`int __stdcall VfsDeleteFile(HANDLE hInstance, char* RemotePath);```
`int __stdcall VfsGetFile(``HANDLE hInstance, char* RemoteName, char* LocalName, int CopyFlags``);``` ``
`int __stdcall VfsPutFile(HANDLE hInstance, char* LocalName, char* RemoteName, int CopyFlags);```
`int __stdcall VfsExecuteFile(``HANDLE hInstance, HWND MainWin, char* RemoteName, char* Verb``);``` ``
`int __stdcall VfsCreateFolder(HANDLE hInstance, char* RemotePath);```
`int __stdcall VfsRemoveFolder(``HANDLE hInstance, char* RemotePath``);``` ``
`void __stdcall VfsNetworkGetSupportedProtocols(````char* Protocols, int MaxLen);```
`int __stdcall VfsNetworkGetConnection(``HANDLE hInstance,` `int Index,` `char*` `Connection, int MaxLen);``` ``
`int __stdcall` `VfsNetworkManageConnection(``HANDLE hInstance,` `HWND MainWin,` `char*` `Connection, int Action, int MaxLen);``` ``
`int __stdcall` `VfsNetworkOpenConnection(``HANDLE hInstance,` `char*` `Connection,` `char*``RootDir,``` `char*``RemotePath, int MaxLen);``` ``
`int __stdcall` `VfsNetworkCloseConnection(``HANDLE hInstance,` `char*` `Connection``);``` ``

### Constants

`VFS_NM_ACTION_ADD = 0;`
`VFS_NM_ACTION_EDIT = 1;`
`VFS_NM_ACTION_DELETE = 2;`
`VFS_RET_OK = 0;`
`VFS_RET_FAILED = 1;`
`VFS_RET_ABORTED = 2;`
`VFS_RET_NOT_SUPPORTED = 3;```
```VFS_RET_FILE_NOT_FOUND = 4;```
`VFS_RET_FILE_EXISTS = 5;`
`VFS_RET_READ_ERROR = 6;`
`VFS_RET_WRITE_ERROR = 7;`
`VFS_EXEC_OK = 0;`
`VFS_EXEC_ERROR = 1;`
`VFS_EXEC_YOURSELF = 2;`
`VFS_EXEC_SYMLINK = 3;`

## Description

### Functions and Procedures

`HANDLE __stdcall VfsOpen(char* Path);` ``

Initialize and open plugin file system.

###### Parameters

Path
  Path that must be opened by plugin

###### Returns

The function returns plugin instance handle if successful, `NULL` otherwise

`void __stdcall VfsClose(HANDLE` `hInstance``);``` ``

Finalize and close plugin file system.

###### Parameters

Handle
  Plugin file system instance handle that have been returned by FsOpen

`BOOL __stdcall VfsMoveFile(``HANDLE hInstance, char* OldName, char* NewName, int CopyFlags``);` ``

VfsMoveFile is called to transfer (copy or move) a file within the plugin's file system.

###### Parameters

`hInstance`
  Plugin file system instance handle
`OldName`
  Name of the remote source file, with full path
`NewName`
  Name of the remote destination file, with full path
`CopyFlags```
  Can be a combination of the VFS_COPYFLAGS_XXX flags

###### Returns

The function returns `True` if successful, `False` otherwise

`BOOL __stdcall VfsGetFile(``HANDLE hInstance, char* RemoteName,char* LocalName,int CopyFlags``);` ``

VfsGetFile is called to transfer a file from the plugin's file system to the normal file system.

###### Parameters

`hInstance`
  Plugin file system instance handle
`RemoteName`
  Name of the file to be retrieved, with full path
`LocalName`
  Local file name with full path
`CopyFlags```
  Can be a combination of the VFS_COPYFLAGS_XXX flags

###### Returns

The function returns `True` if successful, `False` otherwise

`BOOL __stdcall VfsPutFile(``HANDLE hInstance, char* LocalName, char* RemoteName, int CopyFlags``);` ``

VfsPutFile is called to transfer a file from the normal file system to the plugin's file system.

###### Parameters

`hInstance`
  Plugin file system instance handle
`LocalName`
  Local file name with full path
`RemoteName`
  Name of the remote file, with full path
`CopyFlags```
  Can be a combination of the VFS_COPYFLAGS_XXX flags

###### Returns

The function returns `True` if successful, `False` otherwise

`BOOL __stdcall VfsDeleteFile(``HANDLE hInstance, char* RemotePath``);` ``

VfsDeleteFile is called to delete a file from the plugin's file system.

###### Parameters

`hInstance`
  Plugin file system instance handle
```RemotePath```
  Name of the file to be deleted, with full path

###### Returns

The function returns `True` if successful, `False` otherwise

`int __stdcall VfsExecuteFile(HANDLE` `hInstance, HWND MainWin,` `char* RemoteName, char* Verb``);` ``

VfsExecuteFile is called to execute a file on the plugin's file system, or show its property sheet.

###### Parameters

`hInstance`
  Plugin file system instance handle
`MainWin`
  Parent window which can be used for showing a property sheet
`RemoteName`
  Name of the file to be executed, with full path
`Verb`
  Plugin file system instance handle that have been returned by VfsOpen

###### Returns

The function returns `True` if successful, `False` otherwise

`int __stdcall VfsCreateFolder(HANDLE` `hInstance,` `char* RemoteName``);` ``

VfsCreateFolder is called to create a directory on the plugin's file system.

###### Parameters

`hInstance`
  Plugin file system instance handle
`RemoteName`
  Name of the directory to be created, with full path

###### Returns

The function returns `True` if successful, `False` otherwise

`int __stdcall VfsRemoveFolder(HANDLE` `hInstance, char* RemoteName``);` ``

VfsRemoveFolder is called to remove a directory from the plugin's file system.

###### Parameters

`hInstance`
  Plugin file system instance handle
`RemoteName`
  Name of the directory to be removed, with full path

###### Returns

The function returns `True` if successful, `False` otherwise

`void __stdcall VfsNetworkGetSupportedProtocols(char* Protocols, int MaxLen);` ``

VfsNetworkGetSupportedProtocols is called to retrieve protocols that supported by plugin.

###### Parameters

Protocols
  Pointer to a buffer (allocated by the calling program) which can receive the semicolon separated protocol list, e.g. "http://;ftp://"
MaxLen
  Maximum number of characters (including the final 0) which fit in the buffer.

```BOOL __stdcall VfsNetworkGetConnection(``int Index, char*` `Connection, int MaxLen);` ``````

VfsNetworkGetConnection is called to enumerate all connections that plugin has. Index is increased by 1 starting from 0 until the plugin returns `False`.

###### Parameters

Index
  The index of the connection for which DC requests information. Starting with 0, the Index is increased until the plugin returns `False`.
Connection
  Here the plugin has to return the name of the connection with index Index. You may return a maximum of maxlen characters, including the trailing 0.
MaxLen
  The maximum number of characters, including the trailing 0, which may be returned in each of the connections.

###### Returns

The function returns `True` if successful, `False` otherwise

```BOOL __stdcall` `VfsNetworkManageConnection(``HWND MainWin, char*` `Connection, int Action, int MaxLen);` ````````

VfsNetworkManageConnection is called from "Connection manager" dialog when user wants to add/edit/delete connection.

###### Parameters

MainWin
  Parent window which can be used for showing a connection configuration dialog.
Connection
  In: Connection name for edit/delete action
  Out: Connection name of new connection for add action
Action
  Action type: `FS_NM_ACTION_ADD` or `FS_NM_ACTION_EDIT` or `FS_NM_ACTION_DELETE`
MaxLen
  Maximum number of characters that you can return in Connection, including the final 0.

###### Returns

The function returns `True` if successful, `False` otherwise

```BOOL __stdcall` `VfsNetworkOpenConnection(``char*` `Connection,` `char*``RootDir,``` `char*``RemotePath, int MaxLen);` ``````

VfsNetworkOpenConnection is called when the user wants to open a connection to the network.

###### Parameters

Connection
  In: Connection name
  Out: Server address, e.g. "ftp://ftp.chg.ru"
RootDir
  Here the plugin has to return the root directory of the opening connection, e.g. "/"
RemotePath
  Here the plugin has to return the remote path of the opening connection, e.g. "/pub/Linux"
MaxLen
  Maximum number of characters that you can return in Connection, RootDir and RemotePath, including the final 0.

###### Returns

The function returns `True` if successful, `False` otherwise

```BOOL __stdcall` `VfsNetworkCloseConnection(``char*` `Connection``);` ``````

VfsNetworkOpenConnection is called when the user wants to close a connection to the network.

###### Parameters

Connection
  Connection name

###### Returns

The function returns `True` if successful, `False` otherwise

### Constants

``VFS_NM_ACTION_ADD = 0;``
Add connection action.

``VFS_NM_ACTION_EDIT = 1;``
Edit connection action.

``VFS_NM_ACTION_DELETE = 2;``
Delete connection action.

```VFS_RET_OK` = 0;``
Delete connection action.

``VFS_NM_ACTION_DELETE = 2;``
Delete connection action.

``VFS_NM_ACTION_DELETE = 2;``
Delete connection action.

``VFS_NM_ACTION_DELETE = 2;``
Delete connection action.

``VFS_NM_ACTION_DELETE = 2;``
Delete connection action.

``VFS_NM_ACTION_DELETE = 2;``
Delete connection action.

``VFS_NM_ACTION_DELETE = 2;``
Delete connection action.

``VFS_NM_ACTION_DELETE = 2;``
Delete connection action.

``VFS_NM_ACTION_DELETE = 2;``
Delete connection action.

``VFS_NM_ACTION_DELETE = 2;``
Delete connection action.

``VFS_NM_ACTION_DELETE = 2;``
Delete connection action.

``VFS_NM_ACTION_DELETE = 2;``
Delete connection action.

Double Commander DFX plugin API