![](/img/trans.png)
[英]Creating copy of a file at one position up in the same folder/directory location
[英]Is it possible to create a program that can redirect folder icon directory depending on the file location?
背景
你们好 首先, 这是一个动漫文件夹,其中显示了我所有带有不同文件夹图标的动漫系列。 所有上述自定义图标都位于名为“ icons”的隐藏文件夹中。 这种格式是我在相应年份的其他文件夹中列出的格式。
问题/情况
众所周知,当我们移动/篡改“ icons”文件夹或动漫文件夹的目录时,链接断开,动漫系列的自定义图标消失。 可以通过再次分配自定义图标或重命名目录来解决此问题。
我倾向于将动漫文件夹复制到其他硬盘驱动器。 我想知道是否有可能创建一个程序,根据其所在位置自动修复动漫文件夹的目录链接。
例如,假设我从目录“ G:\\ 2018”复制2018动漫文件夹并将其放置在桌面中。 假设“慢速启动”的自定义文件夹图标仍为G:\\ 2018 \\ icons \\ Slow_Start_Folder_Icon.ico。 该程序在运行时将自动将目录链接更改为C:\\ Users **** \\ Desktop \\ 2018 \\ icons \\ Slow_Start_Folder_Icon.ico。 当然,与其他动漫文件夹同时出现。
任何启发性的答案将不胜感激。 在此先感谢。
更新3:这是我当前的工作代码,来自@Jimi。 经过测试,对我有用。
private static void UpdateIcons() //for updating folder icons to new directory
{
int start, end;
string filedir = Environment.CurrentDirectory, olddir = null, newdir = null;
IEnumerable<string> Ini = Directory.EnumerateFiles(filedir, "desktop.ini", SearchOption.AllDirectories);
foreach (string deskini in Ini)
{
File.SetAttributes(deskini, FileAttributes.Archive);
foreach (var line in File.ReadAllLines(deskini))
{
if (line.Contains("IconResource"))
{
start = line.IndexOf("icons");
Console.WriteLine(line);
Console.WriteLine(line.Length.ToString());
Console.WriteLine(line.IndexOf("icons").ToString());
if (line.Contains(","))
{
end = line.IndexOf(",");
olddir = line.Substring(start, (end - start));
Console.Write(end - start);
}
else
{
end = line.Length - 1;
Console.Write(end);
olddir = line.Substring(start, (end - start + 1));
Console.Write(end - start);
}
newdir = File.ReadAllText(deskini);
newdir = newdir.Replace(line, "IconResource=" + filedir + "\\" + olddir);
File.WriteAllText(deskini, newdir, Encoding.Unicode);
Console.WriteLine(olddir);
Console.WriteLine(newdir);
}
}
File.SetAttributes(deskini, FileAttributes.Hidden);
}
}
该应用程序接受命令行参数,可以在其中指定Icons存储库(文件夹名称)。 如果未提供任何内容,则假定在当前执行路径中找到图标存储库名为“ icons”。
Assembly.GetExecutingAssembly用于确定可执行路径。 Location
属性返回标准格式的Path。
Directory.GetDirectories用于获取当前路径中目录的目录列表,包括SubDirectories。 然后将当前路径和图标目录从列表中排除,因为这些文件夹不受定制。
Directory.GetFiles()用于构建包含在Icons文件夹中的图标文件列表。
为了更新Folders自定义项(Explorer在更新这些更改时可能有点懒 :在没有其他指示的情况下使用IconCache.db
存储),我们PInvoke SHGetSetFolderCustomSettings 。
此Shell API创建或更新位于每个自定义文件夹内的desktop.ini
文件。 此文件引用用作文件夹自定义图标的图标。
此功能允许快速更新文件夹的新方面。 在这种情况下,更新是立即的。 无需删除图标缓存或重新启动资源管理器。
相关信息:
如何使用Desktop.ini自定义文件夹
本文档是Windows Shell文档“ Shell操作手册”的一部分。
SHFOLDERCUSTOMSETTINGS
的旧定义,官方文档中缺少。
将此代码编译为Release
然后将可执行文件复制到列出自定义子文件夹的上层文件夹中。
注意:
在此示例中,我从Icons存储库中随机选择Icon分配给文件夹(使用Random
值)。 您需要定义自己的逻辑以将正确的图标分配给特定的文件夹。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
public enum FolderCustomSettingsMask : uint
{
InfoTip = 0x00000004,
Clsid = 0x00000008,
IconFile = 0x00000010,
Logo = 0x00000020,
Flags = 0x00000040
}
public enum FolderCustomSettingsRW : uint
{
Read = 0x00000001,
ForceWrite = 0x00000002,
ReadWrite = Read | ForceWrite
}
[SecurityCritical]
[DllImport("Shell32.dll", CharSet = CharSet.Auto)]
static extern uint SHGetSetFolderCustomSettings(ref SHFOLDERCUSTOMSETTINGS pfcs, string pszPath, FolderCustomSettingsRW dwReadWrite);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
struct SHFOLDERCUSTOMSETTINGS
{
public uint dwSize;
public FolderCustomSettingsMask dwMask;
public IntPtr pvid;
public string pszWebViewTemplate;
public uint cchWebViewTemplate;
public string pszWebViewTemplateVersion;
public string pszInfoTip;
public uint cchInfoTip;
public IntPtr pclsid;
public uint dwFlags;
public string pszIconFile;
public uint cchIconFile;
public int iIconIndex;
public string pszLogo;
public uint cchLogo;
}
static void Main(string[] args)
{
string CurrentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string IconsFolder = args.Length > 0 ? args[0] : Path.Combine(CurrentPath, @"icons");
UpdateFolderIcons(CurrentPath, IconsFolder);
Console.WriteLine($"Press any key to terminate...");
Console.ReadKey();
}
[SecuritySafeCritical]
public static void UpdateFolderIcons(string BaseFolder, string IconsFolder)
{
Console.WriteLine($"Current path: {BaseFolder}");
Console.WriteLine($"Processing...");
Console.WriteLine();
List<string> ExcludeDirList = new List<string>() {BaseFolder, IconsFolder};
List<string> DirList = Directory.GetDirectories(BaseFolder, "*", SearchOption.AllDirectories).ToList();
DirList = DirList.Except(ExcludeDirList).ToList();
if (DirList.Count == 0) {
Console.WriteLine($"No directories found!");
return;
}
Console.WriteLine($"{DirList.Count} Directories found");
Console.WriteLine("Updating...");
Console.WriteLine();
int UpdateCount = 0;
List<string> IconNames = Directory.GetFiles(Path.Combine(BaseFolder, IconsFolder), "*").ToList();
if (IconNames.Count == 0) {
Console.WriteLine($"No icons found in {IconsFolder}");
return;
}
foreach (string sPath in DirList)
{
string IconName = IconNames[random.Next(0, IconNames.Count)];
SHFOLDERCUSTOMSETTINGS FolderSettings = new SHFOLDERCUSTOMSETTINGS {
dwMask = FolderCustomSettingsMask.IconFile,
pszIconFile = IconName,
iIconIndex = 0
};
uint hResult = SHGetSetFolderCustomSettings(
ref FolderSettings, sPath + char.MinValue, FolderCustomSettingsRW.ForceWrite);
UpdateCount += 1;
}
Console.WriteLine($"{UpdateCount} Files Updated");
Console.WriteLine();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.