- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要能够检查本地 OneDrive 文件夹是否同步/最新。
我可以在不使用任何 One Drive API 的情况下通过查看任何文件/文件夹属性(在 C# 代码中)来检查吗?
最佳答案
我被困住了,并想检查主文件夹图标。
已编辑
重点是提取同步文件夹图标并获取覆盖 CLSID。
你首先需要一个类来提取你需要的信息:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace MyApp.Classes
{
public class ExtractIconInfo
{
[Flags]
private enum SHGFI : uint
{
SHGFI_ICON = 0x000000100,
SHGFI_DISPLAYNAME = 0x000000200,
SHGFI_TYPENAME = 0x000000400,
SHGFI_ATTRIBUTES = 0x000000800,
SHGFI_ICONLOCATION = 0x000001000,
SHGFI_EXETYPE = 0x000002000,
SHGFI_SYSICONINDEX = 0x000004000,
SHGFI_LINKOVERLAY = 0x000008000,
SHGFI_SELECTED = 0x000010000,
SHGFI_ATTR_SPECIFIED = 0x000020000,
SHGFI_LARGEICON = 0x000000000,
SHGFI_SMALLICON = 0x000000001,
SHGFI_OPENICON = 0x000000002,
SHGFI_SHELLICONSIZE = 0x000000004,
SHGFI_PIDL = 0x000000008,
SHGFI_USEFILEATTRIBUTES = 0x000000010,
SHGFI_ADDOVERLAYS = 0x000000020,
SHGFI_OVERLAYINDEX = 0x000000040
}
[Flags]
private enum FileAttributes : uint
{
Readonly = 0x00000001,
Hidden = 0x00000002,
System = 0x00000004,
Directory = 0x00000010,
Archive = 0x00000020,
Device = 0x00000040,
Normal = 0x00000080,
Temporary = 0x00000100,
SparseFile = 0x00000200,
ReparsePoint = 0x00000400,
Compressed = 0x00000800,
Offline = 0x00001000,
NotContentIndexed = 0x00002000,
Encrypted = 0x00004000,
Virtual = 0x00010000
}
[Flags]
public enum ISIOI : uint
{
ISIOI_ICONFILE = 0x00000001,
ISIOI_ICONINDEX = 0x00000002
}
private SortedDictionary<string, Guid> ShellIconOverlayIdentifiers;
public string IconName { get; private set; }
public Icon Icon { get; private set; }
public int IconOverlayIndex { get; private set; }
public Guid IconOverlayGuid { get; private set; }
public ExtractIconInfo(FileInfo fi)
{
ExtractIcon(fi.FullName, false);
}
public ExtractIconInfo(DirectoryInfo di)
{
ExtractIcon(di.FullName, true);
}
public ExtractIconInfo(string path, bool isFolder)
{
ExtractIcon(path, isFolder);
}
[ComVisible(false)]
[ComImport]
[Guid("0C6C4200-C589-11D0-999A-00C04FD655E1")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface IShellIconOverlayIdentifier
{
[PreserveSig]
int IsMemberOf([MarshalAs(UnmanagedType.LPWStr)] string path, uint attributes);
[PreserveSig]
int GetOverlayInfo([MarshalAs(UnmanagedType.LPWStr)] string iconFileBuffer, int iconFileBufferSize, out int iconIndex, out uint flags);
[PreserveSig]
int GetPriority(out int priority);
}
[StructLayout(LayoutKind.Sequential)]
private struct SHFILEINFO
{
internal IntPtr hIcon;
internal int iIcon;
internal uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
internal string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
internal string szTypeName;
};
[DllImport("shell32.dll")]
private static extern IntPtr SHGetFileInfo(
string pszPath,
uint dwFileAttributes,
ref SHFILEINFO psfi,
uint cbSizeFileInfo,
uint uFlags
);
[DllImport("shell32.dll")]
private static extern int SHGetIconOverlayIndex(
string pszIconPath,
int iIconIndex
);
[DllImport("user32.dll")]
public static extern int DestroyIcon(IntPtr hIcon);
private void ExtractIcon(string path, bool isFolder)
{
SHFILEINFO shIconInfo = new SHFILEINFO();
SHGetFileInfo(path, isFolder ? (uint)FileAttributes.Directory : (uint)FileAttributes.Normal, ref shIconInfo, (uint)Marshal.SizeOf(shIconInfo), (uint)SHGFI.SHGFI_ICON | (uint)SHGFI.SHGFI_LARGEICON | (uint)SHGFI.SHGFI_DISPLAYNAME | (uint)SHGFI.SHGFI_ADDOVERLAYS | (uint)SHGFI.SHGFI_OVERLAYINDEX);
Icon = (Icon)Icon.FromHandle(shIconInfo.hIcon).Clone();
IconName = shIconInfo.szDisplayName;
IconOverlayIndex = (shIconInfo.iIcon >> 24) & 0xFF;
GetOverlayIconGuid();
DestroyIcon(shIconInfo.hIcon);
}
private void GetOverlayIconGuid()
{
IconOverlayGuid = Guid.Empty;
GetRegistryShellIconOverlayIdentifiers();
foreach (string key in ShellIconOverlayIdentifiers.Keys)
{
string AIconFileName = string.Empty;
int AIconIndex = 0;
Guid value = ShellIconOverlayIdentifiers[key];
GetOverlayIconInfo(value, out AIconFileName, out AIconIndex);
if (SHGetIconOverlayIndex(AIconFileName, AIconIndex) == IconOverlayIndex)
IconOverlayGuid = value;
}
}
private void GetOverlayIconInfo(Guid CLSID, out string path, out int index)
{
try
{
path = new string(' ', 256);
uint flags = 0;
IShellIconOverlayIdentifier SHIOI = Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID, true), true) as IShellIconOverlayIdentifier;
SHIOI.GetOverlayInfo(path, path.Length, out index, out flags);
Marshal.ReleaseComObject(SHIOI);
if ((flags & (uint)ISIOI.ISIOI_ICONFILE) != 0)
{
if ((flags & (uint)ISIOI.ISIOI_ICONINDEX) == 0) index = 0;
}
else
{
path = string.Empty;
index = 0;
}
path = path.Substring(0, path.IndexOf('\0'));
}
catch
{
path = string.Empty;
index = 0;
}
}
private void GetRegistryShellIconOverlayIdentifiers()
{
ShellIconOverlayIdentifiers = new SortedDictionary<string, Guid>();
using (RegistryKey key32 = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, Environment.MachineName, RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers"))
foreach (string subKey in key32.GetSubKeyNames())
{
Guid value = Guid.Parse((string)key32.OpenSubKey(subKey).GetValue(null));
if (!ShellIconOverlayIdentifiers.ContainsKey(subKey))
ShellIconOverlayIdentifiers.Add(subKey, value);
}
using (RegistryKey key64 = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, Environment.MachineName, RegistryView.Registry64).OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers"))
foreach (string subKey in key64.GetSubKeyNames())
{
Guid value = Guid.Parse((string)key64.OpenSubKey(subKey).GetValue(null));
if (!ShellIconOverlayIdentifiers.ContainsKey(subKey))
ShellIconOverlayIdentifiers.Add(subKey, value);
}
}
}
}
这里的相关信息是IconOverlayGuid
。
然后比较:
public enum SyncStatus { Off, Unknown, Syncing, Synced, SharedSyncing, SharedSynced, Error }
private SyncStatus CheckIfSync(DirectoryInfo di)
{
ExtractIconInfo IcoInfo = new ExtractIconInfo(di);
if (IcoInfo != null)
{
if (IcoInfo.IconOverlayGuid == Guid.Empty) return SyncStatus.Off;
else if (IcoInfo.IconOverlayGuid == new Guid("{BBACC218-34EA-4666-9D7A-C78F2274A524}")) return SyncStatus.Error;
else if (IcoInfo.IconOverlayGuid == new Guid("{F241C880-6982-4CE5-8CF7-7085BA96DA5A}")) return SyncStatus.Synced;
else if (IcoInfo.IconOverlayGuid == new Guid("{A0396A93-DC06-4AEF-BEE9-95FFCCAEF20E}")) return SyncStatus.Syncing;
else if (IcoInfo.IconOverlayGuid == new Guid("{5AB7172C-9C11-405C-8DD5-AF20F3606282}")) return SyncStatus.SharedSynced;
else if (IcoInfo.IconOverlayGuid == new Guid("{A78ED123-AB77-406B-9962-2A5D9D2F7F30}")) return SyncStatus.SharedSyncing;
else return SyncStatus.Unknown;
}
else return SyncStatus.Unknown;
}
覆盖图标存储在 FileSyncShell.dll
中。它们的 CLSID 存储在注册表中:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers
和 HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers
.
希望对您有所帮助!
(我在那上面花了太多时间,但我学到了很多东西!)
关于c# - 如何检查本地 OneDrive 文件夹是否同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41241247/
我需要使用 power automate + Office 脚本从一个 Excel 工作表复制数据并粘贴(仅值)到另一个工作表 我开始使用下面链接中的答案创建流程。 Power Automate: C
我试图删除这个项目文件夹,但即使在我运行 rm -force 之后它仍然拒绝我.它向我展示了这个: is an NTFS junction point. Use the Force parameter
当我使用“知道此链接的任何人都可以查看此项目”选项在 UI 中创建共享链接时,我得到一个类似于 https://onedrive.live.com/redir?resid=XXX!YYYY&authk
(创建超链接后,我将在 OneNote 中使用它链接到我自己的 Onedrive 上的文件,仅供我使用!) 当我在线查看 Word 中的文件时,显示的 URL 是: https://onedrive.
我想在一个 rest API 调用中获取 office365 onedrive 文件夹中包含的所有文件和文件夹,有没有办法做到这一点? 最佳答案 没有特定的 API 调用来检索 Drive 的平面表示
我正在构建一个 Windows 服务,该服务使用以下方法通过 Graph API 连接到 OneDrive for Business: https://graph.microsoft.io/en-us
请允许我解释什么我在做什么以及如何我在做什么。 我在做什么? 我正在尝试使用其 REST API 将文件上传到 Onedrive来源:one drive api documentation 我正在使用
我正在尝试使用 java sdk 将文件上传到 OneDrive 特殊文件夹,但出现以下错误 错误代码:BadRequest 错误消息:使用“microsoft.graph.createUploadS
我正在尝试使用 OneDrive iOS SDK 将 OneDrive 集成到我的应用程序中。我设法做了我想做的大部分事情,但我似乎无法弄清楚如何在 OneDrive 上的文件夹(项目)中上传图像。上
Microsoft Graph 可以提供 List items shared with the signed-in user 。我想将此 REST 功能与 OneDrive file picker f
我正在尝试通过以下 URL 获取 OneDrive 访问 token https://login.live.com/oauth20_token.srf?client_id=YOUR_CLIENT_ID
我是 skydrive 的新生。然后我想在html中使用文件选择器,并从Interactive Live SDK复制演示代码。但运行结果,打开的窗口并没有直接到文件选择器页面,只是直接到我设置的red
如果我想在保存后使用打开的 Workbook 对象获取 Excel 文件的全名,但该文件已同步到 OneDrive,我会得到一个“https”地址,而不是其他程序无法解释的本地地址。 如何获取这样的文
我刚刚开始使用 OneDrive API。我有一个与 Google Drive 和 Dropbox 集成并从这些服务接收推送通知的应用程序,我希望包含 OneDrive 支持。 也许我没有在看 rig
尝试以不那么困惑的方式存储用户设置和默认保存的数据位置。 在 PC1 上, Label1.Caption := TPath.GetDocumentsPath; 向我显示 C:\Users\Mike\D
我想检查用户是否已经登录到 OneDrive,如果没有,则允许他们登录。我首先在 JS/HTML 项目中尝试过此操作。然后使用 C#/XAML 项目。 我查看了 C#/XAML OneDrive 代码
所以我制作了一个 OneDrive uploader ,它使用 Azure,目前它不适用于教育或工作场所帐户。它仅适用于普通的 Microsoft 帐户。如何让我的应用程序与其他类型的 Microso
我是 Azure 开发的新手。所以我尝试从微软文档( https://learn.microsoft.com/en-us/learn/modules/msgraph-access-file-data/
我正在尝试使用以下网址提取根文件夹中的所有文件: https://api.onedrive.com/v1.0/drive/root/children 但这也给了我同一文件夹下的所有文件夹。有没有办法只
我在引用中没有找到在 WP8.1 上使用 OneDrive SDK 创建新 OneDrive 文件夹的方法。我正在寻找一种跨设备和平台备份和同步的方法。 最佳答案 您可以使用 REST 在 OneDr
我是一名优秀的程序员,十分优秀!