网站建设描述怎么写动漫制作专业需要绘画基础吗

张小明 2026/1/19 19:01:42
网站建设描述怎么写,动漫制作专业需要绘画基础吗,爱站工具网,淘宝实时优惠券网站怎么做的云同步程序开发围绕Placeholder进行的#xff01; 这个微软官方定义占位符文件 生成支持占位符文件的云同步引擎 - Win32 apps | Microsoft Learn 同步引擎可以创建只占用 1 KB 存储空间用于文件系统标头的占位符文件#xff0c;并在正常使用条件下自动转变为完整文件。 占…云同步程序开发围绕Placeholder进行的这个微软官方定义占位符文件生成支持占位符文件的云同步引擎 - Win32 apps | Microsoft Learn同步引擎可以创建只占用 1 KB 存储空间用于文件系统标头的占位符文件并在正常使用条件下自动转变为完整文件。 占位符文件在 Windows Shell 中以典型文件的形式呈现给应用程序和最终用户。占位符文件从 Windows 内核垂直集成到 Windows Shell并且与占位符文件的应用兼容性通常不是问题。 无论你是使用文件系统 API、命令提示符还是桌面或 UWP 应用来访问占位符文件文件都会解除冻结而无需进行其他代码更改并且该应用可以正常使用该文件。文件可以存在于三种状态占位符文件Placeholder文件的空表示形式仅当同步服务可用时才可用。完整文件Full文件已隐式冻结如果需要空间系统可能会解除冻结。固定的完整文件(Full Pinned)该文件已由用户通过文件资源管理器下载并保证可脱机使用。下图演示了文件资源管理器中如何显示占位符、完整和固定的完整文件状态。在真正开始写FetchData 回调、流式下载、同步状态更新之前必须先理解一个核心问题CFAPI 为什么一定要用“占位符Placeholder”如果不理解这一点后面几乎所有行为——Explorer 显示、CreateFile 行为、OnFetchData 触发时机、同步状态图标——都会让人困惑。一、CFAPI 的本质目标CFAPICloud Files API的目标不是“做一个网盘下载器”而是让远端数据在本地看起来就像真实存在的文件系统对象也就是说用户视角系统视角文件已经在磁盘上实际数据可能完全不在本地能看到文件名、大小、时间仅存在元数据双击才下载按需拉取数据占位符Placeholder正是实现这一点的基础设施。二、什么是占位符Placeholder一句话定义占位符是一个“没有真实文件数据但具备完整文件系统元信息的文件 / 目录对象”它存在于 NTFS 中但内容是“空的”或“未实体化的”。占位符具备什么✔ 文件名✔ 路径✔ 文件大小✔ 创建 / 修改时间✔ 文件属性✔ 同步状态云、已下载、部分下载占位符缺少什么✘ 实际文件数据Data Stream三、没有占位符会发生什么假设你不用占位符而是“真正下载后才创建文件”。1️⃣ Explorer 无法显示远端文件文件不在磁盘上Explorer 没有任何对象可枚举用户看到的是一个“空目录”用户体验直接失败2️⃣ CreateFile 无法被拦截CFAPI 的核心是当用户或程序访问文件时系统回调给 Provider但前提是这个文件对象已经存在于 NTFS没有占位符CreateFile(cloud.txt) → ERROR_FILE_NOT_FOUNDFetchData 根本不会触发3️⃣ Windows 无法管理同步状态这些状态图标☁ 云端✔ 本地⬇ 正在下载全部依赖于占位符 CFAPI 状态机没有占位符Windows 不知道这个文件是不是云文件是否允许按需下载是否可以释放本地数据四、占位符在 CFAPI 中的地位你可以把占位符理解为Cloud Files 的“合同文件”CFAPI 的工作流程简化远端元数据 ↓ CfCreatePlaceholders ↓ 占位符NTFS 对象 ↓ 用户访问CreateFile / Read ↓ OnFetchData 回调 ↓ 下载真实数据 ↓ CfWriteFile / CfCompleteFetchData没有占位符就没有后续所有步骤五、占位符 ≠ 空文件非常关键这是新手最容易犯的错误。项目占位符空文件NTFS 对象有有文件大小可为真实大小通常为 0数据是否存在❌✅触发 FetchData✅❌支持按需下载✅❌⚠空文件一旦存在真实数据流CFAPI 就认为“你已经有数据了”这也是你之前遇到的CreateFile 直接触发下载或不触发 FetchData或 ERROR_CLOUD_FILE_INVALID_REQUEST的根本原因之一。六、为什么 CFAPI 要“先占位、后取数”1️⃣ 性能百万级文件列表秒级展示目录结构不下载任何内容2️⃣ 资源管理磁盘空间可控CfDehydratePlaceholder 可释放本地数据系统自动回收3️⃣ 系统一致性ExplorerCMD / PowerShell第三方程序CreateFile全部通过 NTFS 统一入口七、结合你当前开发中的几个关键点✔ 为什么只是CreateFile就触发OnFetchData因为打开的是占位符访问方式涉及数据访问系统认为需要实体化✔ 为什么获取句柄要小心 FlagsFILE_FLAG_OPEN_REPARSE_POINT避免系统认为你要读数据只是“操作占位符元信息”✔ 为什么 CfOpenFileWithOplock 很重要它明确告诉系统这是 Provider 操作不是用户访问避免错误触发 FetchData八、一句话总结占位符不是“可选项”而是 CFAPI 的根基。没有占位符Explorer 不可见FetchData 不触发同步状态失效CFAPI 退化成普通文件 IO九、占位符(Placeholder)操作类使用 C# .NET8Project SdkMicrosoft.NET.Sdk PropertyGroup OutputTypeExe/OutputType TargetFrameworknet8.0-windows10.0.17763.0/TargetFramework ImplicitUsingsenable/ImplicitUsings Nullableenable/Nullable /PropertyGroup ItemGroup PackageReference IncludeMicrosoft.Windows.CsWinRT Version2.2.0 / PackageReference IncludeSerilog Version4.3.0 / PackageReference IncludeSerilog.Sinks.Console Version6.1.1 / PackageReference IncludeVanara.PInvoke.CldApi Version4.2.1 / PackageReference IncludeVanara.PInvoke.SearchApi Version4.2.1 / /ItemGroup /Projectusing Serilog; using System.ComponentModel; using System.Runtime.InteropServices; using Vanara.PInvoke; using static Vanara.PInvoke.CldApi; using static Vanara.PInvoke.Kernel32; namespace CfapiSync { public class Placeholder { public static bool Create(string fileId , string baseDirectoryPath, string relativeFileName, CF_FS_METADATA fsMetadata) { bool isDirectory fsMetadata.BasicInfo.FileAttributes.HasFlag(FileFlagsAndAttributes.FILE_ATTRIBUTE_DIRECTORY); var cloudEntry new CF_PLACEHOLDER_CREATE_INFO { FileIdentity Marshal.StringToCoTaskMemUni(fileId), FileIdentityLength (uint)(fileId.Length * Marshal.SizeOf(typeof(char))), RelativeFileName relativeFileName, FsMetadata fsMetadata, Flags CF_PLACEHOLDER_CREATE_FLAGS.CF_PLACEHOLDER_CREATE_FLAG_MARK_IN_SYNC, }; if (isDirectory) { cloudEntry.Flags | CF_PLACEHOLDER_CREATE_FLAGS.CF_PLACEHOLDER_CREATE_FLAG_DISABLE_ON_DEMAND_POPULATION; cloudEntry.FsMetadata.FileSize 0; } var entitys new CF_PLACEHOLDER_CREATE_INFO[] { cloudEntry }; var res CfCreatePlaceholders(baseDirectoryPath, entitys, 1, CF_CREATE_FLAGS.CF_CREATE_FLAG_NONE, out uint entresProcessed); if (res.Succeeded) { Log.Information($Placeholder- Create : {relativeFileName} ); return true; } if(res.Code 183) { Log.Warning($Placeholder- Create - 已经存在 {relativeFileName} ); Convert(fileId, System.IO.Path.Combine(baseDirectoryPath, relativeFileName)); return false; } if (!res.Succeeded) { Log.Error($Placeholder- Create : {relativeFileName} 创建失败 {res}); return false; } return true; } public static bool Convert(string fileId, string filePath) { var hFile CreateFile(filePath, Kernel32.FileAccess.FILE_GENERIC_READ | Kernel32.FileAccess.FILE_GENERIC_WRITE, FileShare.ReadWrite | FileShare.Delete, null, FileMode.Open, FileFlagsAndAttributes.FILE_FLAG_OPEN_REPARSE_POINT | FileFlagsAndAttributes.FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero); if (hFile.IsInvalid) { Log.Warning(Placeholder- Convert: 文件无效); return false; } var fileIdentity Marshal.StringToCoTaskMemUni(fileId); var fileIdentityLength (uint)(fileId.Length * Marshal.SizeOf(typeof(char))); // CF_CONVERT_FLAG_NONE 什么都不显示 // CF_CONVERT_FLAG_MARK_IN_SYNC 与云同步 绿色对号 // CF_CONVERT_FLAG_DEHYDRATE 文件操作后 变为云文件 var res CfConvertToPlaceholder(hFile, fileIdentity, fileIdentityLength, CF_CONVERT_FLAGS.CF_CONVERT_FLAG_MARK_IN_SYNC, out long ConvertUsn, 0); hFile.Dispose(); if (res.Succeeded) { Log.Information($Placeholder- Convert : {filePath} ); return true; } else { Log.Error($Placeholder- Convert : {filePath} 转换失败 {res}); return false; } } // 将占位符恢复为常规文件去除所有特殊特征例如重分析标记、文件标识等。 public static bool Revert( string filePath) { var hFile CreateFile(filePath, Kernel32.FileAccess.FILE_GENERIC_READ | Kernel32.FileAccess.FILE_GENERIC_WRITE, FileShare.ReadWrite | FileShare.Delete, null, FileMode.Open, FileFlagsAndAttributes.FILE_FLAG_OPEN_REPARSE_POINT | FileFlagsAndAttributes.FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero); var res CfRevertPlaceholder(hFile, CF_REVERT_FLAGS.CF_REVERT_FLAG_NONE,0); if (res.Succeeded) { Log.Information($Placeholder- Revert : {filePath} ); } else { Log.Error($Placeholder- Revert : {filePath} 转换失败 {res}); } return true; } public static bool Update(string filePath, CF_FS_METADATA fsMetadata) { var hFile CreateFile(filePath, Kernel32.FileAccess.FILE_GENERIC_READ | Kernel32.FileAccess.FILE_GENERIC_WRITE, FileShare.ReadWrite | FileShare.Delete, null, FileMode.Open, FileFlagsAndAttributes.FILE_FLAG_OPEN_REPARSE_POINT | FileFlagsAndAttributes.FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero); // HRESULT hr CfOpenFileWithOplock(filePath,CF_OPEN_FILE_FLAGS.CF_OPEN_FILE_FLAG_DELETE_ACCESS, out SafeHCFFILE hFile); //if (hr.Failed) //{ // Log.Error($Placeholder- Update : {filePath} 更新失败); // return false; //} IntPtr infoBuffer IntPtr.Zero; try { CF_PLACEHOLDER_INFO_CLASS infoClass CF_PLACEHOLDER_INFO_CLASS.CF_PLACEHOLDER_INFO_STANDARD; uint bufferLength (uint)Marshal.SizeOfCF_PLACEHOLDER_STANDARD_INFO() 4096; infoBuffer Marshal.AllocHGlobal((int)bufferLength); var fileHandle hFile.DangerousGetHandle(); var hr CfGetPlaceholderInfo( fileHandle, infoClass, infoBuffer, bufferLength, out uint returnedLength); if (hr.Failed) { Log.Error($Placeholder- Update : {filePath} 更新失败); return false; } var standardInfo Marshal.PtrToStructureCF_PLACEHOLDER_STANDARD_INFO(infoBuffer); // 2. FileIdentity 必须有效 if (standardInfo.FileIdentity null || standardInfo.FileIdentity.Length 0 || standardInfo.FileIdentityLength 0) { throw new InvalidOperationException(Invalid FileIdentity.); } GCHandle handle GCHandle.Alloc(standardInfo.FileIdentity, GCHandleType.Pinned); try { IntPtr fileIdentityPtr handle.AddrOfPinnedObject(); System.Int64 usn 0; hr CfUpdatePlaceholder( fileHandle, // 句柄无效 fsMetadata, fileIdentityPtr, standardInfo.FileIdentityLength, null, 0, CF_UPDATE_FLAGS.CF_UPDATE_FLAG_VERIFY_IN_SYNC, ref usn ); if (hr.Failed) { Log.Error($Placeholder- Update : {filePath} 更新失败{hr}); return false; } } finally { handle.Free(); } Log.Information($Placeholder- Update : {filePath}); return true; } finally { if (infoBuffer ! IntPtr.Zero) Marshal.FreeHGlobal(infoBuffer); hFile.Dispose(); } } /// summary /// 判断路径否是 Cloud Placeholder,以及它的脱水与同步状态 /// /summary public static CF_PLACEHOLDER_STATE GetStatus(string filePath, out bool isPlaceholder, out bool isDehydrated ,out bool isSynced ) { isPlaceholder false; isDehydrated false; isSynced false; var hFile CreateFile( filePath, 0, FileShare.ReadWrite | FileShare.Delete, null, FileMode.Open, FileFlagsAndAttributes.FILE_FLAG_OPEN_REPARSE_POINT | FileFlagsAndAttributes.FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero); if (hFile.IsInvalid) { Log.Error($Placeholder- GetStatus : {filePath}文件无效); return CF_PLACEHOLDER_STATE.CF_PLACEHOLDER_STATE_INVALID; } try { int size Marshal.SizeOfFILE_ATTRIBUTE_TAG_INFO(); IntPtr infoBuffer Marshal.AllocHGlobal(size); try { bool ok GetFileInformationByHandleEx(hFile, FILE_INFO_BY_HANDLE_CLASS.FileAttributeTagInfo, infoBuffer, (uint)size); if (!ok) { Log.Error($Placeholder- GetStatus - GetFileInformationByHandleEx - {filePath} ); return CF_PLACEHOLDER_STATE.CF_PLACEHOLDER_STATE_INVALID; } CF_PLACEHOLDER_STATE state CfGetPlaceholderStateFromFileInfo(infoBuffer, FILE_INFO_BY_HANDLE_CLASS.FileAttributeTagInfo); if (state CF_PLACEHOLDER_STATE.CF_PLACEHOLDER_STATE_INVALID) throw new InvalidOperationException(Invalid placeholder state); isPlaceholder (state CF_PLACEHOLDER_STATE.CF_PLACEHOLDER_STATE_PLACEHOLDER) ! 0; isDehydrated (state CF_PLACEHOLDER_STATE.CF_PLACEHOLDER_STATE_PLACEHOLDER) ! 0 (state CF_PLACEHOLDER_STATE.CF_PLACEHOLDER_STATE_PARTIALLY_ON_DISK) ! 0; isSynced (state CF_PLACEHOLDER_STATE.CF_PLACEHOLDER_STATE_IN_SYNC) ! 0; Log.Information($Placeholder- GetStatus : {filePath},state-{state}); return state; } finally { Marshal.FreeHGlobal(infoBuffer); } } finally { hFile.Dispose(); } } /// summary /// 设置占位符文件或文件夹的同步状态。 /// /summary /// param namefilePath文件地址/param /// param namesyncOngoing同步进行中/param /// returns/returns public static bool SetStatus(string filePath, bool syncOngoing) { var hFile CreateFile( filePath, 0, FileShare.ReadWrite | FileShare.Delete, null, FileMode.Open, FileFlagsAndAttributes.FILE_FLAG_OPEN_REPARSE_POINT | FileFlagsAndAttributes.FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero); if (hFile.IsInvalid) { Log.Error($Placeholder- GetStatus : {filePath}文件无效); return false; } CF_IN_SYNC_STATE inSyncState syncOngoing ? CF_IN_SYNC_STATE.CF_IN_SYNC_STATE_IN_SYNC : CF_IN_SYNC_STATE.CF_IN_SYNC_STATE_NOT_IN_SYNC; CF_SET_IN_SYNC_FLAGS inSyncFlags CF_SET_IN_SYNC_FLAGS.CF_SET_IN_SYNC_FLAG_NONE; long inSyncUsn 0; var res CfSetInSyncState(hFile, inSyncState, inSyncFlags, ref inSyncUsn); hFile.Dispose(); if (res.Succeeded) { Log.Information($Placeholder- SetStatus : {filePath},state-{syncOngoing}); return true; } else { Log.Error($Placeholder- SetStatus : {filePath},state-{syncOngoing}); return false; } } /// summary /// 获取占位符信息 /// /summary public static CF_PLACEHOLDER_STANDARD_INFO GetInfo( string filePath) { var hFile CreateFile( filePath, 0, FileShare.ReadWrite | FileShare.Delete, null, FileMode.Open, FileFlagsAndAttributes.FILE_FLAG_OPEN_REPARSE_POINT | FileFlagsAndAttributes.FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero); if (hFile.IsInvalid) { Log.Error($Placeholder- GetInfo : {filePath}文件无效); throw new Win32Exception(Marshal.GetLastWin32Error()); } try { var infoClass CF_PLACEHOLDER_INFO_CLASS.CF_PLACEHOLDER_INFO_STANDARD; var length 4096; var buffer Marshal.AllocHGlobal( length); // 正式获取信息 HRESULT hr CfGetPlaceholderInfo( hFile, infoClass, buffer, (uint)length, out uint returnedLength); if (hr.Failed) { Log.Error($Placeholder- GetInfo : 获取失败 {hr}); Marshal.ThrowExceptionForHR(hr.Code); } var info Marshal.PtrToStructureCF_PLACEHOLDER_STANDARD_INFO(buffer); Log.Information($Placeholder- GetInfo : 获取成功{info}); Marshal.FreeHGlobal(buffer); return info; } finally { hFile.Dispose(); } } //CF_PIN_STATE_PINNED 固定文件用户本地一定有完整文件内容 //CF_PIN_STATE_UNPINNED 取消固定文件不需要始终保留本地内容可以节省磁盘空间 //CF_PIN_STATE_EXCLUDED 排除同步占位符永远不被同步到云端 //CF_PIN_STATE_INHERIT 继承, 状态继承自父目录 //CF_PIN_STATE_UNSPECIFIED 未指定, 系统自由管理占位符内容 public static bool SetPinState(string path, CF_PIN_STATE state) { var hFile CreateFile(path, Kernel32.FileAccess.FILE_GENERIC_READ | Kernel32.FileAccess.FILE_GENERIC_WRITE, FileShare.ReadWrite | FileShare.Delete, null, FileMode.Open, FileFlagsAndAttributes.FILE_FLAG_OPEN_REPARSE_POINT |FileFlagsAndAttributes.FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero); if (hFile.IsInvalid) { Console.WriteLine(Failed to open file.); return false; } var res CfSetPinState(hFile, state, CF_SET_PIN_FLAGS.CF_SET_PIN_FLAG_NONE, IntPtr.Zero); hFile.Dispose(); if (res.Succeeded) { Log.Information($Placeholder- SetPinState({state}) : {path} ); return true; } else { Log.Warning($Placeholder- SetPinState({state}) : {path} , 错误 {res} ); return false; } } } }Create —— 创建占位符根据远端文件或目录的元数据在本地 NTFS 中创建一个云文件占位符。创建后文件立即可见但不包含实际数据不占用磁盘空间。Convert —— 转换为占位符将一个已存在的普通文件或目录转换为云同步占位符。常用于接管本地已有文件使其纳入云同步体系。Revert —— 恢复为普通文件移除文件的云占位符特性将其还原为标准 NTFS 文件或目录。用于解除云同步绑定或回滚云文件状态。Update —— 更新占位符元数据更新占位符的文件大小、时间戳、属性等元数据信息。用于同步远端变更不涉及文件数据读写。GetStatus —— 获取占位符状态判断指定路径是否为云占位符并获取其实体化与同步状态。用于决定是否需要下载、脱水或更新同步标识。SetStatus —— 设置同步状态显式设置占位符的“已同步 / 未同步”状态。用于控制 Explorer 中的同步完成图标显示。GetInfo —— 获取占位符详细信息读取占位符的标准 CFAPI 信息结构包括标识、状态和标志位。主要用于调试、审计或高级同步逻辑判断。SetPinState —— 固定 / 取消固定文件设置占位符文件的固定策略控制是否必须常驻本地数据。用于支持“始终保留本地副本”或“按需下载”的用户行为。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站开发代码无中文城乡与住房建设厅官网

还在为华硕笔记本性能发挥不充分而困扰吗?G-Helper作为一款轻量级性能控制工具,能够让你完全掌控ROG、TUF、Flow等系列笔记本的硬件性能。相比官方软件,它更加稳定高效,是每一位华硕用户必备的性能优化神器。 【免费下载链接】g-h…

张小明 2025/12/27 22:55:55 网站建设

最好网站建站公司竞价托管

链表是一种动态数据结构,通过节点间的指针连接实现数据存储。队列是一种先进先出的线性结构,链表实现队列可以避免数组实现时的空间限制问题。入队:从队尾加入出队:从队首移除一、数据结构定义两个节点:front&#xff…

张小明 2025/12/29 13:38:14 网站建设

做视频网站多大空间够青海省住房城乡建设厅网站

不知道哪看到一段话,觉得很有道理,记录一下: 根据IEEE最新行业调查报告(2024),工程师面临三大核心矛盾: 深度VS广度:FPGA要求掌握RTL级设计能力,ARM需要理解操作系统调…

张小明 2026/1/13 16:54:42 网站建设

网站后台首页设计我的世界手机做图的网站

题目描述给定一个长度为 n 的整数数组 a 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, a[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。​ 输出容器可以储存的最大水量。**说明:**你不能倾斜容器。输入格式…

张小明 2025/12/25 16:26:12 网站建设

塑胶加工 技术支持 东莞网站建设seo推广介绍

第一章:从文本到视频只需1分钟?Open-AutoGLM自动化生成实测揭秘在AIGC技术飞速发展的当下,Open-AutoGLM作为一款新兴的多模态自动化生成框架,正以惊人的效率重新定义内容创作边界。其核心能力在于将自然语言描述一键转化为高质量短…

张小明 2026/1/6 23:24:46 网站建设

html网站注册页面html5网页设计论文

本文展示了大模型领域的高薪前景(86-94W),专业人才稀缺。课程涵盖Flash Attention、RAG、LoRA、多模态模型等技术,帮助系统掌握大模型原理与应用开发,提升科研与就业竞争力。北航计算机硕士,收到3份大模型offer,薪资86…

张小明 2025/12/25 16:26:08 网站建设