private static void WriteFile(string path, byte[] contents) { using (FileStream fileStream = SystemIO.IO_OS.FileOpenWrite(path)) { Utility.CopyStream(new MemoryStream(contents), fileStream); } }
public void LongPath() { string folderPath = Path.Combine(this.DATAFOLDER, new string('x', 10)); SystemIO.IO_OS.DirectoryCreate(folderPath); string fileName = new string('y', 255); string filePath = SystemIO.IO_OS.PathCombine(folderPath, fileName); byte[] fileBytes = { 0, 1, 2 }; WriteFile(filePath, fileBytes); Dictionary <string, string> options = new Dictionary <string, string>(this.TestOptions); using (Controller c = new Controller("file://" + this.TARGETFOLDER, options, null)) { IBackupResults backupResults = c.Backup(new[] { this.DATAFOLDER }); Assert.AreEqual(0, backupResults.Errors.Count()); Assert.AreEqual(0, backupResults.Warnings.Count()); } Dictionary <string, string> restoreOptions = new Dictionary <string, string>(this.TestOptions) { ["restore-path"] = this.RESTOREFOLDER }; using (Controller c = new Controller("file://" + this.TARGETFOLDER, restoreOptions, null)) { IRestoreResults restoreResults = c.Restore(new[] { filePath }); Assert.AreEqual(0, restoreResults.Errors.Count()); Assert.AreEqual(0, restoreResults.Warnings.Count()); } string restoreFilePath = SystemIO.IO_OS.PathCombine(this.RESTOREFOLDER, fileName); Assert.IsTrue(SystemIO.IO_OS.FileExists(restoreFilePath)); MemoryStream restoredStream = new MemoryStream(); using (FileStream fileStream = SystemIO.IO_OS.FileOpenRead(restoreFilePath)) { Utility.CopyStream(fileStream, restoredStream); } Assert.AreEqual(fileBytes, restoredStream.ToArray()); }
/// <summary> /// SharePoint has nested subwebs but sometimes different webs /// are hooked into a sub path. /// For finding files SharePoint is picky to use the correct /// path to the web, so we will trial and error here. /// The user can give us a hint by supplying an URI with a double /// slash to separate web. /// Otherwise it's a good guess to look for "/documents", as we expect /// that the default document library is used in the path. /// If that won't help, we will try all possible pathes from longest /// to shortest... /// </summary> private static string findCorrectWebPath(Utility.Uri orgUrl, System.Net.ICredentials userInfo, out SP.ClientContext retCtx) { retCtx = null; string path = orgUrl.Path; int webIndicatorPos = path.IndexOf("//"); // if a hint is supplied, we will of course use this first. if (webIndicatorPos >= 0) { string testUrl = new Utility.Uri(orgUrl.Scheme, orgUrl.Host, path.Substring(0, webIndicatorPos), null, null, null, orgUrl.Port).ToString(); if (testUrlForWeb(testUrl, userInfo, false, out retCtx) >= 0) return testUrl; } // Now go through path and see where we land a success. string[] pathParts = path.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); // first we look for the doc library int docLibrary = Array.FindIndex(pathParts, p => StringComparer.InvariantCultureIgnoreCase.Equals(p, "documents")); if (docLibrary >= 0) { string testUrl = new Utility.Uri(orgUrl.Scheme, orgUrl.Host, string.Join("/", pathParts, 0, docLibrary), null, null, null, orgUrl.Port).ToString(); if (testUrlForWeb(testUrl, userInfo, false, out retCtx) >= 0) return testUrl; } // last but not least: try one after the other. for (int pi = pathParts.Length - 1; pi >= 0; pi--) { if (pi == docLibrary) continue; // already tested string testUrl = new Utility.Uri(orgUrl.Scheme, orgUrl.Host, string.Join("/", pathParts, 0, pi), null, null, null, orgUrl.Port).ToString(); if (testUrlForWeb(testUrl, userInfo, false, out retCtx) >= 0) return testUrl; } // nothing worked :( return null; }