IFileSystem: Difference between revisions
m (→See Also: Mounting Other Content seems to cover similar territory, but isn't properly linked in) |
Trleighton (talk | contribs) |
||
| Line 133: | Line 133: | ||
The following code segment should be added to both <code>CHLClient::Init</code> in src\cl_dll\cdll_client_int.cpp and <code>CServerGameDLL::DLLInit</code> in src\dlls\GameInterface.cpp after <code>filesystem</code> is initialized. | The following code segment should be added to both <code>CHLClient::Init</code> in src\cl_dll\cdll_client_int.cpp and <code>CServerGameDLL::DLLInit</code> in src\dlls\GameInterface.cpp after <code>filesystem</code> is initialized. | ||
filesystem->AddSearchPath("'''path'''", "GAME"); | filesystem->AddSearchPath("'''path'''", "GAME"); | ||
if(filesystem->MountSteamContent('''id''')==FILESYSTEM_MOUNT_FAILED) | if(filesystem->MountSteamContent(-'''id''')==FILESYSTEM_MOUNT_FAILED) | ||
return false; | return false; | ||
'''<tt>path</tt>''' should be retrieved from [[Game Name Abbreviations]] | '''<tt>path</tt>''' should be retrieved from [[Game Name Abbreviations]] | ||
'''<tt>id</tt>''' should be retrieved from [[Steam Application IDs]] | '''<tt>id</tt>''' should be retrieved from [[Steam Application IDs]] | ||
'''<tt>-</tt>''' is a negative sign (Subtract) and is required to mount content properly. | |||
==See Also== | ==See Also== | ||
* {{doxygen|filesystem_8h-source.html filesystem.h on HL2 SDK Doxygen}} | * {{doxygen|filesystem_8h-source.html filesystem.h on HL2 SDK Doxygen}} | ||
* [[Mounting Other Content]] | * [[Mounting Other Content]] | ||
[[Category:Programming]][[Category:Interfaces]] | [[Category:Programming]][[Category:Interfaces]] | ||
Revision as of 13:40, 2 April 2008
Here you will find all the information you ever wanted to know about the File System in Source: how to open files, how to read files, how to create new directories and how to find a file on the local system.
My Game Directory
This does not deal specifically with the filesystem, but you might find this useful for your project.
//Server char * pGameDir = new char[1024]; engine->GetGameDir(pGameDir, 1024); //Client const char *pGameDir = engine->GetGameDirectory();
Create Directory
To create a directory you need to know two things; the relative path containing the new directory name and Path ID where the path will be created — called a Path ID because it does not appear to be possible to create a directory using anything other than a search path id.
Default Path Ids
DEFAULT_WRITE_PATHMODGAMEGAMEBIN
char * relpath = new char[1024]; Q_snprintf(relpath, 1024, "stuff\\%s", "newdirectory"); filesystem->CreateDirHierarchy( relpath, "MOD" );
This code will create a newdirectory in your stuff directory, which if does not exist will be created along with newdirectory inside of your MOD directory.
Delete Directory
To remove a directory, first make sure to remove all the files in that directory. Then you can call this code:
#include "direct.h"
char *toRemove = new char[1096]; toRemove[0] = 0; #ifndef CLIENT_DLL char * pGameDir = new char[1024]; engine->GetGameDir(pGameDir, 1024); #else const char *pGameDir = engine->GetGameDirectory(); #endif Q_strcat(toRemove, pGameDir); //concatenate the rest of the directory name here _rmdir(toRemove);
Copy File
bool CopyFile(const char *from, const char *to)
{
Assert(from);
Assert(to);
CUtlBuffer buf;
// Read in file to copy
if(filesystem->ReadFile(from, "MOD", buf))
return filesystem->WriteFile(to, "MOD", buf); // Write out copy
return false;
}
File I/O
I/O Modes
r |
Open a text file for reading |
w |
Create a text file for writing |
a |
Append to a text file |
rb |
Open a binary file for reading |
wb |
Create a binary file for writing |
ab |
Append to a binary file |
r+ |
Open a text file for read/write |
w+ |
Create a text file for read/write |
a+ |
Append to or create a text file for read/write |
rb+ |
Open a binary file for read/write |
wb+ |
Create a binary file for read/write |
ab+ |
Append to or create a binary file for read/write |
FileHandle_t fh;
fh = filesystem->Open( "mylog.log", "a", "MOD");
if (fh)
{
filesystem->FPrintf(fh, "%s", "Logging A Test Line...");
filesystem->Close(fh);
}
or
FileHandle_t fh;
fh = filesystem->Open( "mylog.log", "a", "MOD");
if (fh)
{
char* text = "Logging A Test Line...";
filesystem->Write(text, Q_strlen(text), fh);
filesystem->Close(fh);
}
So in this example we open mylog.log in Append mode. Then we print the line Logging A Test Line... and close the file.
Search Files
To iterate through a list of files in a given Path ID you would do the following.
FileFindHandle_t findHandle;
const char *pFilename = filesystem->FindFirstEx( "*.*", "MOD", &findHandle );
while ( pFilename != NULL )
{
pFilename = filesystem->FindNext( findHandle );
}
filesystem->FindClose( findHandle );
*.* is the wildcard to match the files against. "MOD" is the Path ID.
The value in pFilename for each filesystem->FindNext is nothing but the file name (i.e. for maps/d1_trainstation_01.bsp, pFilename would be d1_trainstation_01)
Mount Steam Application Content
The following code segment should be added to both CHLClient::Init in src\cl_dll\cdll_client_int.cpp and CServerGameDLL::DLLInit in src\dlls\GameInterface.cpp after filesystem is initialized.
filesystem->AddSearchPath("path", "GAME");
if(filesystem->MountSteamContent(-id)==FILESYSTEM_MOUNT_FAILED)
return false;
path should be retrieved from Game Name Abbreviations
id should be retrieved from Steam Application IDs
- is a negative sign (Subtract) and is required to mount content properly.