148
// file open/read/write/close
149
open(resource: URI, opts: IFileOpenOptions): Promise<number> {
151
>
const write = isFileOpenForWriteOptions(opts);
152
>
const append = write && !!opts.append;
153
>
154
>
if (!file) {
155
>
if (!write) {
156
throw createFileSystemProviderError('file not found', FileSystemProviderErrorCode.FileNotFound);
157
}
159
>
const basename = resources.basename(resource);
160
>
const parent = this._lookupParentDirectory(resource);
161
>
file = new File(basename);
162
>
file.data = new Uint8Array(0);
163
>
parent.entries.set(basename, file);
164
>
this._fireSoon({ type: FileChangeType.ADDED, resource });
165
>
} else if (file instanceof Directory) {
166
throw createFileSystemProviderError('file is directory', FileSystemProviderErrorCode.FileIsADirectory);
167
}
169
>
if (!file.data) {
170
file.data = new Uint8Array(0);
171
}
173
>
const fd = this.memoryFdCounter++;
174
>
this.fdMemory.set(fd, { file, resource, write, append });
175
>
return Promise.resolve(fd);
176
>
}
177
178
close(fd: number): Promise<void> {
180
>
if (fdData?.write) {
181
>
// Update file metadata on close
182
>
fdData.file.mtime = Date.now();
183
>
fdData.file.size = fdData.file.data?.byteLength ?? 0;
184
>
this._fireSoon({ type: FileChangeType.UPDATED, resource: fdData.resource });
185
>
}
186
>
this.fdMemory.delete(fd);
187
>
return Promise.resolve();
188
>
}
189
190
read(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number> {
192
>
if (!fdData) {
193
throw createFileSystemProviderError(`No file with that descriptor open`, FileSystemProviderErrorCode.Unavailable);
194
}
196
>
if (!fdData.file.data) {
197
return Promise.resolve(0);
198
}
200
>
const toWrite = VSBuffer.wrap(fdData.file.data).slice(pos, pos + length);
201
>
data.set(toWrite.buffer, offset);
202
>
return Promise.resolve(toWrite.byteLength);
203
>
}
204
205
write(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number> {
207
>
if (!fdData) {
208
throw createFileSystemProviderError(`No file with that descriptor open`, FileSystemProviderErrorCode.Unavailable);
209
}
211
>
const toWrite = VSBuffer.wrap(data).slice(offset, offset + length);
212
>
fdData.file.data ??= new Uint8Array(0);
213
>
214
>
// In append mode, always write at the end
215
>
const writePos = fdData.append ? fdData.file.data.byteLength : pos;
216
>
217
>
// Grow the buffer if needed
218
>
const endPos = writePos + toWrite.byteLength;
219
>
if (endPos > fdData.file.data.byteLength) {
220
>
const newData = new Uint8Array(endPos);
221
>
newData.set(fdData.file.data, 0);
222
>
fdData.file.data = newData;
223
>
}
224
>
225
>
fdData.file.data.set(toWrite.buffer, writePos);
226
>
return Promise.resolve(toWrite.byteLength);
227
>
}
228
229
// --- manage files/folders