/// <summary>Translate file open flags from System.IO into pCloud's Linux-friendly variant.</summary> static eFileOpenFlags openFlags(FileMode mode, FileAccess access) { if (access == FileAccess.Read) { if (mode != FileMode.Open) { throw new ArgumentException("File mode incompatible with Read access"); } return(eFileOpenFlags.None); } eFileOpenFlags flags = eFileOpenFlags.O_WRITE; switch (mode) { case FileMode.CreateNew: flags |= eFileOpenFlags.O_CREAT | eFileOpenFlags.O_EXCL; break; case FileMode.Create: flags |= eFileOpenFlags.O_CREAT | eFileOpenFlags.O_TRUNC; break; case FileMode.Open: break; case FileMode.OpenOrCreate: flags |= eFileOpenFlags.O_CREAT; break; case FileMode.Truncate: flags |= eFileOpenFlags.O_TRUNC; break; case FileMode.Append: flags |= eFileOpenFlags.O_APPEND; break; } return(flags); }
/// <summary>Open file, return the descriptor</summary> static async Task <FileDescriptor> createFileImpl(this Connection conn, object pathOrId, eFileOpenFlags flags) { RequestBuilder req = conn.newRequest("file_open"); req.add("flags", (long)flags); if (pathOrId is long id) { req.add("fileid", id); } else if (pathOrId is string path) { req.add("path", path); } else { throw new ArgumentException("Session.openFile expects either long id, or string path"); } var response = await conn.send(req); return(new FileDescriptor(response.dict)); }
/// <summary>Open an existing file specified by file ID</summary> public static Task <FileDescriptor> createFile(this Connection conn, long fileId, FileMode mode, FileAccess access) { eFileOpenFlags flags = openFlags(mode, access); return(conn.createFileImpl(fileId, flags)); }