public static void GetFSItemProperties(FileSystemVolumeItem item, out ItemProperty[] properties, out Dictionary <string, string> nameProperty) { List <ItemProperty> tmp; GetCommonItemProperties(item, out tmp, out nameProperty); tmp.Add(new ItemProperty(S._("Location"), item.Location, 202)); if (item.LastWriteTime.Ticks > 0L) { tmp.Add(new ItemProperty(S._("Last write time"), item.LastWriteTime.ToString(), 205)); } if (item.IsSymLink) { FileSystemVolumeItem targetItem = item.GetSymLinkTargetItem(); string symlinkTargetPath = null; if (targetItem.Location != "/" && targetItem.Name != "/") { symlinkTargetPath = string.Format("{0}/{1}", targetItem.Location, targetItem.Name); } else { symlinkTargetPath = targetItem.Location + targetItem.Name; } tmp.Add(new ItemProperty(S._("Symlink target"), symlinkTargetPath, 203)); } if (item is FileVolumeItem) { FileVolumeItem fvi = (FileVolumeItem)item; string sizeStr = Util.GetSizeStr(fvi.Size); string hash = fvi.Hash; tmp.Add(new ItemProperty(S._("Size"), sizeStr, 204)); if (!string.IsNullOrEmpty(hash)) { tmp.Add(new ItemProperty(S._("Hash"), hash, 207)); } } if (!string.IsNullOrEmpty(item.MimeType)) { tmp.Add(new ItemProperty(S._("Filetype"), item.MimeType, 206)); } tmp.Sort(); // sort by priority properties = tmp.ToArray(); }
protected override void LoadFromObject(VolumeDB.VolumeItem item) { if (!(item is FileSystemVolumeItem)) { throw new ArgumentException(string.Format("must be of type {0}", typeof(FileSystemVolumeItem)), "item"); } base.LoadFromObject(item); FileSystemVolumeItem fsvi = (FileSystemVolumeItem)item; UpdateLabel(lblLocation, fsvi.Location); UpdateLabel(lblLastWriteTime, fsvi.LastWriteTime.ToString()); UpdateLabel(lblMimeType, string.IsNullOrEmpty(fsvi.MimeType) ? "-" : fsvi.MimeType); }
public void InsertSymLinkItems(BufferedVolumeItemWriter writer, long volumeID) { if (symLinkItems.Count == 0) { return; } /* if scanner has no db associated, just update the counters * and return */ if (!scanner.HasDB) { foreach (SymLinkItem sli in symLinkItems) { if (sli.isDir) { Interlocked.Increment(ref scanner.VolumeInfo.directories); } else { Interlocked.Increment(ref scanner.VolumeInfo.files); } // TODO : // increase totalsize by size of symlinks too? (not size of target!) // or are symlinks as big as dirs, those aren't respected as well.. //Interlocked.Add(ref VolumeInfo.size, sli.size); } return; } // make sure all files/dirs have been written to the database // before searching for symlink targets. writer.Flush(); foreach (SymLinkItem sli in symLinkItems) { scanner.CheckForCancellationRequest(); long itemID; if (!files.TryGetValue(sli.fullTargetPath, out itemID)) { /* may throw ScanCancelledException */ scanner.SendScannerWarning(string.Format(S._("Failed to resolve target item for symlink '{0}'."), sli.fullPath)); } else { SearchCriteriaGroup g = new SearchCriteriaGroup(MatchRule.AllMustMatch); g.AddSearchCriteria(new IDSearchCriteria(volumeID, IDSearchField.VolumeID, CompareOperator.Equal)); g.AddSearchCriteria(new IDSearchCriteria(itemID, IDSearchField.ItemID, CompareOperator.Equal)); // query target item. // async BeginItemSearch() won't work here // (active transaction prevents other threads from accessing the database) VolumeItem[] queriedItems = scanner.Database.SearchItem(g); FileSystemVolumeItem targetItem = (FileSystemVolumeItem)queriedItems[0]; FileSystemVolumeItem newItem; if (targetItem is FileVolumeItem) { newItem = scanner.GetNewVolumeItem <FileVolumeItem>(sli.parentID, sli.name, targetItem.MimeType, targetItem.MetaData, VolumeItemType.FileVolumeItem); ((FileVolumeItem)newItem).SetFileVolumeItemFields(((FileVolumeItem)targetItem).Size, ((FileVolumeItem)targetItem).Hash); Interlocked.Increment(ref scanner.VolumeInfo.files); } else // DirectoryVolumeItem { newItem = scanner.GetNewVolumeItem <DirectoryVolumeItem>(sli.parentID, sli.name, targetItem.MimeType, targetItem.MetaData, VolumeItemType.DirectoryVolumeItem); Interlocked.Increment(ref scanner.VolumeInfo.directories); } newItem.SetFileSystemVolumeItemFields(sli.location, targetItem.LastWriteTime, targetItem.ItemID); writer.Write(newItem); // TODO : // increase totalsize by size of symlinks too? (not size of target!) // or are symlinks as big as dirs, those aren't respected as well.. //Interlocked.Add(ref VolumeInfo.size, sli.size); if (Global.EnableDebugging) { Debug.WriteLine("Successfully resolved and saved symlink item: {0}/{1} -> {2}/{3}", (sli.location == PATH_SEPARATOR.ToString() ? "" : sli.location), sli.name, (targetItem.Location == PATH_SEPARATOR.ToString() ? "" : targetItem.Location), (targetItem.Name == PATH_SEPARATOR.ToString() ? "" : targetItem.Name)); } } // end if } // end foreach }