A fork of react-native-fs with a smaller footprint and fixes due to the upstream library seemingly being abandoned.
This library intentional or not has become critical to the success of our mobile applications. We've noticed a few things that led to this fork:
- The original library continuing to expand beyond a basic file system library.
- Hundreds of open issues
- Pull requests go unmerged
- Tests that go untouched
- Some edge case bugs that stay unresolved
We debated a few paths, but we felt it best to fork the project and make some major changes that will upset some.
- We dropped Windows support.
- We dropped methods specific to platforms.
- We dropped upload support.
We will continue to support this library for as long as we use it.
yarn add react-native-fs2
react-native-fs2 | react-native |
---|---|
3.0.x | >=0.69 |
Changes can be found in CHANGELOG.md
import RNFS from 'react-native-fs2';
console.log(await RNFS.getFSInfo());
// mkdir(filepath: string, options?: MkdirOptions): Promise<undefined>
await RNFS.mkdir(`FolderToCreate`);
- Creates directory at
filepath
location. - Optionally include
MkdirOptions
with properties:- (iOS) - NSURLIsExcludedFromBackupKey
- (iOS) - NSFileProtectionKey
// moveFile(filepath: string, destPath: string, options?: FileOptions): Promise<undefined>
await RNFS.moveFile('FileToMove', 'DestinationLocation')
- Moves file from
filepath
todestPath
- Optionally includes
FileOptions
with properties:- (iOS) - NSFileProtectionKey
// copyFile(filepath: string, destPath: string, options?: FileOptions): Promise<undefined>
await RNFS.copyFile('FileToCopy', 'DestinationLocation')
- Copies file from
filepath
todestPath
- Optionally includes
FileOptions
with properties:- (iOS) - NSFileProtectionKey
// getFSInfo(): Promise<FSInfoResult>
const fsInfo = await RNFS.getFSInfo()
- Returns an
FSInfoResult
object that contains information on the device storage space FSInfoResult
- totalSpace:
number
-> The total amount of storage space on the device (in bytes). - freeSpace:
number
-> The amount of available storage space on the device (in bytes)
- totalSpace:
// getAllExternalFilesDirs(): Promise<string[]>
const externalFileDirs = await RNFS.getAllExternalFilesDirs()
- Returns an
array
with the absolute paths to application-specific directories on all shared/external storage devices where the application can place persistent files it owns.
// unlink(filepath: string): Promise<void>
await RNFS.unlink('FileToUnlink')
- Unlinks the item at
filepath
. If the item does not exist, an error will be thrown. Also recursively deletes directories (works like Linuxrm -rf
).
// exists(filepath: string): Promise<boolean>
await RNFS.exists('File')
- Check if the item exists at
filepath
. If the item does not exist, return false.
// completeHandlerIOS(jobId: number): void
await RNFS.completeHandler('JobID')
- Tell iOS you are done handling a completed download when using background downloads.
// readDir(dirPath: string): Promise<ReadDirItem[]>
const dirItems = await RNFS.readDir('DirPath')
- Retuns an
array
ofReadDirItem
which are items that are present in the directory ReadDirItem
- ctime:
Date | undefined
-> The creation date of the file (iOS only) - mtime:
Date | undefined
-> The last modified date of the file - name:
string
-> The name of the item - path:
string
-> The absolute path to the item - size:
number
-> Size in bytes - isFile: () =>
boolean
-> Is the file just a file? - isDirectory: () =>
boolean
-> Is the file a directory?
- ctime:
// readFile(filepath: string, encodingOrOptions?: EncodingOrOptions): Promise<string>
const fileData = await RNFS.readFile('DirPath', 'utf8')
- Reads the
filepath
and return the filecontents
- Optionally includes
EncodingOrOptions
with values:'utf8'
(default) |'base64'
(for binary files) |'ascii'
- ...fileoptions
/*
read(
filepath: string,
length: number = 0,
position: number = 0,
encodingOrOptions?: EncodingOrOptions
): Promise<string>
*/
const fileData = await RNFS.read('FileToRead', 0, 0, 'utf8')
- Reads bytes length from the given position of the file at
filepath
and returns the filecontents
. - Optionally includes
EncodingOrOptions
with values:'utf8'
(default) |'base64'
(for binary files) |'ascii'
- ...fileoptions
// hash(filepath: string, algorithm: string): Promise<string>
const fileChecksum = await RNFS.hash('FileToHash', 'md5')
- Reads the
filepath
and returns its checksum as determined by algorithm, which can be one of the followingmd5
|sha1
|sha224
|sha256
|sha384
|sha512
.
// writeFile(filepath: string, contents: string, encodingOrOptions?: EncodingOrOptions): Promise<void>
await RNFS.write('FileToWrite', 'ContentsToWrite', 'utf8')
- Write the
contents
tofilepath
- Optionally includes
EncodingOrOptions
with values:'utf8'
(default) |'base64'
(for binary files) |'ascii'
- ...fileoptions
// appendFile(filepath: string, contents: string, encodingOrOptions?: EncodingOrOptions): Promise<void>
await RNFS.appendFile('FileToWrite', 'ContentsToAppend', 'utf8')
- Append the
contents
tofilepath
- Optionally includes
EncodingOrOptions
with values:'utf8'
(default) |'base64'
(for binary files) |'ascii'
- ...fileoptions
// write(filepath: string, contents: string, position?: number, encodingOrOptions?: EncodingOrOptions): Promise<void>
await RNFS.write('FileToWrite', 'ContentsToWrite', -1, 'utf8')
- Write the
contents
tofilepath
at the given random access position. When position is undefined or -1 the contents is appended to the end of the file - Optionally includes
EncodingOrOptions
with values:'utf8'
(default) |'base64'
(for binary files) |'ascii'
- ...fileoptions
// stat(filepath: string): Promise<StatResult>
const fileStats = await RNFS.stat('FilePath')
- Retuns an
array
ofStatResult
which arestatistics
of thefile
StatResult
- path:
string
-> The same as filepath argument - ctime:
date
-> The creation date of the file - mtime:
date
-> The last modified date of the file - size:
number
-> Size in bytes - mode:
number
-> UNIX file mode - originalFilepath:
string
-> Android: In case of content uri this is the pointed file path, otherwise is the same as path - isFile: () =>
boolean
-> Is the file just a file? - isDirectory: () =>
boolean
-> Is the file a directory?
- path:
// downloadFile(options: DownloadFileOptions): { jobId: number, promise: Promise<DownloadResult> }
const downloadResults = await RNFS.downloadFile('FilePath')
- Downloads file from
options.fromUrl
tooptions.toFile
. Will overwrite any previously existing file. - Include
DownloadFileOptions
with properties- fromUrl:
string
-> URL to download file from - toFile:
string
-> Local filesystem path to save the file to - headers?:
Headers
-> An object of headers to be passed to the server - background?:
boolean
-> Continue the download in the background after the app terminates (iOS only) - discretionary?:
boolean
-> Allow the OS to control the timing and speed of the download to improve perceived performance (iOS only) - cacheable?:
boolean
- progressInterval?:
number
- progressDivider?:
number
- begin?:
(res: DownloadBeginCallbackResult) => void;
-> Note: it is required when progress prop provided - progress?:
(res: DownloadProgressCallbackResult) => void
; - resumable?:
() => void
-> only supported on iOS - connectionTimeout?:
number
-> only supported on Android - readTimeout?:
number
-> supported on Android and iOS - backgroundTimeout?:
number
-> Maximum time (in milliseconds) to download an entire resource (iOS only, useful for timing out background downloads)
- fromUrl:
- Returns
DownloadResult
- jobId:
number
-> The download job ID, required if one wishes to cancel the download. SeestopDownload
. - statusCode:
number
-> The HTTP status code - bytesWritten:
number
-> The number of bytes written to the file
- jobId:
// stopDownload(jobId: number): void
await RNFS.stopDownload('JobID'): void
- Abort the current download job with this ID. The partial file will remain on the filesystem.
// resumeDownload(jobId: number): void
await RNFS.resumeDownload('JobID'): void
- Resume the current download job with this ID
// isResumable(jobId: number): Promise<bool>
if (await RNFS.isResumable('JobID')) {
RNFS.resumeDownload('JobID')
}
- Check if the the download job with this ID is resumable.
// touch(filepath: string, mtime?: Date, ctime?: Date): Promise<void>
await RNFS.touch('FilePath', Date, Date)
- Sets the modification timestamp
mtime
and creation timestampctime
of the file atfilepath
. Settingctime
is only supported on iOS, Android always sets both timestamps tomtime
.
// scanFile(path: string): Promise<string[]>
await RNFS.scanFile('FilePath', Date, Date)
- Scan the file using Media Scanner.
CachesDirectoryPath
- Absolute path to cache directory.DocumentDirectoryPath
- Absolute path to the document directory.TemporaryDirectoryPath
- Absolute path to temporary directory (cache on Android).
ExternalCachesDirectoryPath
- Absolute path to the external cache directory.ExternalDirectoryPath
- Absolute path to external shared directory.ExternalStorageDirectoryPath
- Absolute path to the external shared storage directory.DownloadDirectoryPath
- Absolute path to the download directory.
Please be sure to request needed permissions via PermissionsAndroid.
LibraryDirectoryPath
- Absolute path to NSLibraryDirectoryMainBundlePath
- Absolute path to main bundle directory.