protected override void Dispose(bool disposing) { if (!disposed) { if (disposing) { thumbGen.Dispose(); } thumbGen = null; sbPathFixer = null; paths = null; symLinkHelper = null; } disposed = true; base.Dispose(disposing); }
// note: // do not allow to modify the constuctor parameters // (i.e. database, options) // through public properties later, since the scanner // may already use them after scanning has been started, // and some stuff has been initialized depending on the // options in the ctor already. public FilesystemVolumeScanner(Platform.Common.IO.DriveInfo drive, VolumeDatabase database, FilesystemScannerOptions options) : base(drive, database, options) { if (!drive.IsMounted) { throw new ArgumentException("Drive is not mounted", "drive"); } if (Options.GenerateThumbnails && string.IsNullOrEmpty(Options.DbDataPath)) { throw new ArgumentException("DbDataPath", "Thumbnail generation requires the DbDataPath option to be set"); } disposed = false; //this.mimeInfo = new MimeInfo(false); this.sbPathFixer = new StringBuilder(1024); this.paths = new Paths(Options.DbDataPath, null, null); this.symLinkHelper = new SymLinkHelper(this); this.thumbGen = new ThumbnailGenerator(); }
private async Task SetInstallationDataPath(MCProfile p, BLInstallation i) { await Task.Run(() => { try { string LocalStateFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Packages", MINECRAFT_PACKAGE_FAMILY, "LocalState"); string PackageFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Packages", MINECRAFT_PACKAGE_FAMILY, "LocalState", "games", "com.mojang"); string PackageBakFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Packages", MINECRAFT_PACKAGE_FAMILY, "LocalState", "games", "com.mojang.default"); string ProfileFolder = Path.GetFullPath(LauncherModel.Default.FilepathManager.GetInstallationsFolderPath(p.Name, i.DirectoryName_Full)); if (Directory.Exists(PackageFolder)) { var dir = new DirectoryInfo(PackageFolder); if (!dir.IsSymbolicLink()) dir.MoveTo(PackageBakFolder); else dir.Delete(true); } DirectoryInfo profileDir = Directory.CreateDirectory(ProfileFolder); SymLinkHelper.CreateSymbolicLink(PackageFolder, ProfileFolder, SymLinkHelper.SymbolicLinkType.Directory); DirectoryInfo pkgDir = Directory.CreateDirectory(PackageFolder); DirectoryInfo lsDir = Directory.CreateDirectory(LocalStateFolder); SecurityIdentifier owner = WindowsIdentity.GetCurrent().User; SecurityIdentifier authenticated_users_identity = new SecurityIdentifier("S-1-5-11"); FileSystemAccessRule owner_access_rules = new FileSystemAccessRule(owner, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow); FileSystemAccessRule au_access_rules = new FileSystemAccessRule(authenticated_users_identity, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow); var lsSecurity = lsDir.GetAccessControl(); AuthorizationRuleCollection rules = lsSecurity.GetAccessRules(true, true, typeof(NTAccount)); List<FileSystemAccessRule> needed_rules = new List<FileSystemAccessRule>(); foreach (AccessRule rule in rules) { if (rule.IdentityReference is SecurityIdentifier) { var required_rule = new FileSystemAccessRule(rule.IdentityReference, FileSystemRights.FullControl, rule.InheritanceFlags, rule.PropagationFlags, rule.AccessControlType); needed_rules.Add(required_rule); } } var pkgSecurity = pkgDir.GetAccessControl(); pkgSecurity.SetOwner(owner); pkgSecurity.AddAccessRule(au_access_rules); pkgSecurity.AddAccessRule(owner_access_rules); pkgDir.SetAccessControl(pkgSecurity); var profileSecurity = profileDir.GetAccessControl(); profileSecurity.SetOwner(owner); profileSecurity.AddAccessRule(au_access_rules); profileSecurity.AddAccessRule(owner_access_rules); needed_rules.ForEach(x => profileSecurity.AddAccessRule(x)); profileDir.SetAccessControl(profileSecurity); } catch (Exception e) { ErrorScreenShow.exceptionmsg(e); throw e; } }); Thread.Sleep(1000); }