{"record":{"id":"39a4d2cfbe844e04","repo":"dotnet/wpf","slug":"sr-packagingwritenotsupported","errorCode":null,"errorMessage":"SR.PackagingWriteNotSupported","messagePattern":"SR\\.PackagingWriteNotSupported","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationUI/MS/Internal/Documents/Application/TransactionalPackage.cs","lineNumber":82,"sourceCode":"\n        _originalPackage = originalPackage;\n        _tempPackage = null;\n    }\n    #endregion Constructors\n\n    #region Internal Methods\n    //-------------------------------------------------------------------------\n    // Internal Methods\n    //-------------------------------------------------------------------------\n\n    /// <exception cref=\"System.ArgumentNullException\" />\n    internal void EnableEditMode(Stream workspace)\n    {\n        ArgumentNullException.ThrowIfNull(workspace);\n\n        if (!workspace.CanWrite)\n        {\n            throw new ArgumentException(\n                SR.PackagingWriteNotSupported,\n                nameof(workspace));\n        }\n\n        Package temporaryPackage = Package.Open(\n            workspace, FileMode.Create, FileAccess.ReadWrite);\n\n        _tempPackage = temporaryPackage;\n    }\n\n    /// <exception cref=\"System.ArgumentNullException\" />\n    /// <exception cref=\"System.ArgumentException\" />\n    internal virtual void MergeChanges(Stream target)\n    {\n        ArgumentNullException.ThrowIfNull(target);\n\n        if (!target.CanWrite)\n        {","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationUI/MS/Internal/Documents/Application/TransactionalPackage.cs#L64-L100","documentation":"TransactionalPackage.EnableEditMode accepts the workspace stream used to stage temporary edits. If the stream passes the null check but cannot be written (workspace.CanWrite is false), it throws ArgumentException(SR.PackagingWriteNotSupported, nameof(workspace)) because edit mode requires a writable workspace.","triggerScenarios":"Calling EnableEditMode with a read-only stream (e.g., a stream opened with FileAccess.Read, a stream wrapped by a read-only StreamProxy, or a read-only network stream).","commonSituations":"Enabling edit mode on a document whose backing store is read-only media; passing a stream opened from a read-only file.","solutions":["Pass a writable workspace stream (CanWrite == true), e.g. FileMode.Open with FileAccess.ReadWrite","Create the workspace over a temp file: File.Create(Path.GetTempFileName())","Verify workspace.CanWrite before calling EnableEditMode","Catch ArgumentException and inform the user the document cannot be edited"],"exampleFix":"// before\npackage.EnableEditMode(File.OpenRead(docPath));\n// after\nusing var workspace = File.Create(Path.GetTempFileName());\nif (workspace.CanWrite)\n    package.EnableEditMode(workspace);","handlingStrategy":"validation","validationCode":"if (workspace == null || !workspace.CanWrite) { /* obtain a writable workspace first */ }","typeGuard":"bool IsValidWorkspace(Stream s) => s != null && s.CanWrite;","tryCatchPattern":"try { pkg.EnableEditMode(ws); } catch (ArgumentException ex) when (ex.ParamName == \"workspace\") { /* get a writable workspace */ }","preventionTips":["Always create the workspace with File.Create or FileMode.Open + FileAccess.ReadWrite","Assert workspace.CanWrite before enabling edit mode","Avoid passing streams derived from read-only sources"],"tags":["wpf","packaging","read-only-stream","argument-validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}