Begin To js【First】

本文详细介绍了JavaScript的基本概念,包括变量声明、元素获取、控制台输出、事件处理等核心内容,适合初学者快速入门。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WHAT ME LEARN
1、变量

var varName=value  //用来存储一个数据或获取到的元素

2、获取元素

//获取元素id
document.getElementById('id');
获取单个元素
document.querySelector('#box');(css3选择器)
//box为id值,获取多个元素
document.querySelectorAll('#box');(css3选择器)

3、console.log() //在控制台输出内容,用于测试代码-
1、F12进入
2、Chrome 下 ctrl+shift+j

4、事件
1、onclick 点击元素时触发
2、onmouseover 鼠标移到元素上触发
3、onmouseout 鼠标移出后触发
4、this 指向触发事件本身的对象

语法
					元素.onclick=function (ev) {
						//这里写处理代码
					}

5、if等语法与java、c基本一样

design a plugin for files of screen-recording's moving to different disks of Xbox Game Bar in PC. reply in Chinese.the detailed of process, and necessary profiles and their codes(C series codes is required).(rules:1.detect and find the enough and largest space between the disks and list priority sequence,they're target disk(default mode) , customized mode is alternative;2. for the recording files, if choose default mode, set a default value such as 1GB for recordings and 10MB for screenshots, they all are based on the resolution of the screen(could find the minimum size of files of different resolutions to fill the default mode),it could customize the minimun size;3.for customize mode, it should detect 2 first and then is 1 to check whether the disks are allowed to move, if not, show popup window to tell the info and cancel(but don't pop the window when running a games), if enough, run the moving as what mode you've chosen, so do as default mode;4.for different games-recording, they could also be classified when moved to different disks or even the same disks but different files;5.for different games-recording, the files' sizes are smaller the customized values but not only one file, cumulating all of them first then run the rule 2 before the disks is full(it should set another default mode different before), and it could give the alternation like games(arrange it a new sequence based the number of most repeated names of games-recording, and the first one is the first to move the another do so), size & number(arrange it from larger to smaller, but they all need to smaller than size mentioned in rule 2,and then number are adjustable,and number of each moving files from larger and smaller will follow it,and first one is the first to move,the another do so)(it should set another customized mode different before);6.screenshot are alternative in the rule, but when it run the rule 4, it need to be classified to different subfolders(screenshot and recording) where the same games-capture folds in;7.when there is a game is running, pause the moving, especially the disk where the running games in;8.to avoid the difficulty of management with the scattered files, no need to run the rule 1 when every time(but not first time you reboot the computer after you install the plugin) of computer booting or game recording until the target disk's space is about to overflow(add timer(could adjustable) to detect it), no matter what mode you've chosen and then pop up to rechoose the mode;9.if the target disk is overflow when moving a file of game-recording, cancel to move it to the new chosen disk, add number as natural sequence in the files' name;10.to avoid to frequent moving of files, it could set a threshold of system disk, pop up the tip when the threshold is about to arrive before recording, threshold setting: it could choose proportion(%) or values(the customized space threshold of system disk),no need to add timer;11.choose the unused cores of CPU as priority;12.if all the disks are fullful,stop moving and popup the warning.13.the mentioned modes are alternative(which means there are third choose that to do nothing like without installing plugin),and all numbers mentioned above(expect popup window) of customized mode could be changed in Setting of Xbox Game Bar)
06-30
<think>我们正在设计一个插件,用于将XboxGame Bar的录屏文件移动到不同的磁盘。这个插件需要支持以下功能: 1.磁盘空间检测:在移动文件前,检查目标磁盘的可用空间。2.默认和自定义模式:提供默认的移动规则,同时允许用户自定义规则。3.游戏特定分类:能够根据游戏名称将录屏文件分类存储。 4.文件大小和数量阈值:当源文件夹中的文件总大小或文件数量超过阈值时,触发移动操作。 5. CPU核心优先级:在移动文件时,设置进程的优先级以降低对CPU的占用(例如,设置为低优先级)。6.用户可配置:用户可以通过配置文件或XboxGame Bar的设置界面进行配置。设计思路: 1.我们需要一个后台服务(或定时任务)来监控Xbox GameBar的默认录屏文件夹(通常位于`C:\Users\<用户名>\Videos\Captures`)。 2.配置文件:用于设置目标磁盘路径、阈值(文件大小和数量)、游戏分类规则等。 3.移动文件时,根据游戏名称创建子文件夹(如果不存在则创建),然后将文件移动到对应的子文件夹中。 4.在移动前,检查目标磁盘的可用空间,确保有足够的空间。 5.使用低CPU优先级来执行文件移动操作,以避免影响游戏性能。步骤: 1.读取配置文件,获取设置。 2.监控源文件夹(Captures)。3.当满足条件(如文件数量超过阈值或总大小超过阈值)时,触发移动操作。4.根据游戏名称分类:我们需要从文件名中提取游戏名称(Xbox GameBar的录屏文件名通常包含游戏名称)。-例如:`Minecraft_20201231-1234.mp4` ->游戏名称为`Minecraft`。5.移动文件到目标磁盘的对应游戏文件夹下。6.移动完成后,删除源文件(或保留?根据配置,通常移动就是剪切)。配置文件设计(例如:config.ini): ```ini[General] ;源文件夹,默认为Captures文件夹SourceFolder=C:\Users\YourUsername\Videos\Captures;目标磁盘根目录DestinationRoot=D:\GameCaptures;检查间隔(分钟) CheckInterval=5;文件数量阈值,当源文件夹中文件数量超过此值时触发移动FileCountThreshold=10;文件总大小阈值(单位MB),当源文件夹中文件总大小超过此值时触发移动TotalSizeThreshold=1024;是否启用游戏分类EnableGameClassification=true;默认目标路径(当无法分类或未设置时使用)DefaultDestination=D:\GameCaptures\Others; CPU优先级:0-低,1-正常,2-高。建议设置为0(低) CpuPriority=0```代码实现(C语言): 我们将编写一个Windows控制台应用程序(或后台服务)。由于需要监控文件夹,我们可以使用`ReadDirectoryChangesW`函数,但为了简化,我们可以使用定时检查的方式。 步骤: 1.读取配置文件。 2.根据配置的检查间隔,定时扫描源文件夹。 3.计算源文件夹中的文件数量和总大小。 4.如果任一阈值超过,则开始移动文件。 5.移动文件时,根据游戏名称分类(如果启用),然后移动到目标文件夹。 6.设置进程优先级。注意:文件移动操作使用`MoveFile`函数(实际上是重命名,如果目标在同一磁盘则很快;如果在不同磁盘,则相当于复制后删除)。我们这里目标在不同磁盘,所以需要复制然后删除源文件,但我们可以使用`MoveFile`跨磁盘移动(系统会自动处理为复制+删除)。但是大文件移动可能会耗时,因此我们使用低优先级。代码结构:```c#include <windows.h> #include<stdio.h>#include <stdlib.h> #include<string.h>#include <shlwapi.h>//用于PathFileExists等#include<sys/stat.h>//用于_stat获取文件大小//配置文件路径#defineCONFIG_FILE "config.ini"//配置结构体typedef struct{char sourceFolder[MAX_PATH];chardestinationRoot[MAX_PATH];int checkInterval;//分钟intfileCountThreshold;doubletotalSizeThreshold;// MBBOOLenableGameClassification;chardefaultDestination[MAX_PATH];int cpuPriority;//0:低,1:正常,2:高}Config; //读取配置文件ConfigReadConfig(){Config config;//默认值strcpy(config.sourceFolder,"C:\\Users\\YourUsername\\Videos\\Captures");strcpy(config.destinationRoot,"D:\\GameCaptures");config.checkInterval =5;config.fileCountThreshold=10;config.totalSizeThreshold =1024.0;//1024 MBconfig.enableGameClassification =TRUE;strcpy(config.defaultDestination, "D:\\GameCaptures\\Others");config.cpuPriority =0;//实际读取INI文件//使用GetPrivateProfileString等函数charbuffer[MAX_PATH];GetPrivateProfileString("General","SourceFolder",config.sourceFolder,config.sourceFolder,MAX_PATH, CONFIG_FILE);GetPrivateProfileString("General", "DestinationRoot", config.destinationRoot,config.destinationRoot, MAX_PATH,CONFIG_FILE);config.checkInterval= GetPrivateProfileInt("General","CheckInterval",config.checkInterval,CONFIG_FILE);config.fileCountThreshold =GetPrivateProfileInt("General", "FileCountThreshold",config.fileCountThreshold, CONFIG_FILE);config.totalSizeThreshold= GetPrivateProfileDouble("General","TotalSizeThreshold", config.totalSizeThreshold,CONFIG_FILE);config.enableGameClassification= GetPrivateProfileInt("General","EnableGameClassification", config.enableGameClassification, CONFIG_FILE);GetPrivateProfileString("General","DefaultDestination",config.defaultDestination,config.defaultDestination,MAX_PATH, CONFIG_FILE);config.cpuPriority= GetPrivateProfileInt("General","CpuPriority", config.cpuPriority,CONFIG_FILE);returnconfig;} //辅助函数:从文件名中提取游戏名称//假设文件名格式为:GameName_YYYYMMDD-HHMMSS.ext//注意:有些游戏名称可能包含下划线,所以我们取第一个下划线之前的部分voidExtractGameName(constchar*filename,char*gameName) {constchar*underscore =strchr(filename,'_');if(underscore){size_tlen =underscore -filename;strncpy(gameName, filename, len);gameName[len]= '\0';}else {//如果没有下划线,则使用文件名(不含扩展名)作为游戏名?//或者使用默认?strcpy(gameName,"Unknown");} }//移动文件函数void MoveFiles(Config config) {WIN32_FIND_DATAfindFileData;HANDLE hFind;charsourcePath[MAX_PATH];sprintf(sourcePath,"%s\\*.*",config.sourceFolder);hFind =FindFirstFile(sourcePath,&findFileData);if (hFind== INVALID_HANDLE_VALUE){return;}//计算文件数量和总大小int fileCount =0;double totalSize =0.0; //单位:字节do{if (findFileData.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY) {continue;}fileCount++;totalSize+= (double)((findFileData.nFileSizeHigh* (MAXDWORD+1)) +findFileData.nFileSizeLow);}while (FindNextFile(hFind,&findFileData)!=0);FindClose(hFind);//转换为MBtotalSize =totalSize/ (1024.0*1024.0);//检查是否超过阈值if (fileCount< config.fileCountThreshold &&totalSize< config.totalSizeThreshold){return;}//设置进程优先级HANDLEhProcess= GetCurrentProcess();switch (config.cpuPriority) {case0:SetPriorityClass(hProcess,IDLE_PRIORITY_CLASS);break;case1: SetPriorityClass(hProcess, NORMAL_PRIORITY_CLASS);break;case2: SetPriorityClass(hProcess, HIGH_PRIORITY_CLASS); break;default:SetPriorityClass(hProcess,IDLE_PRIORITY_CLASS);}//重新打开文件夹,移动文件hFind =FindFirstFile(sourcePath,&findFileData);if (hFind== INVALID_HANDLE_VALUE){return;}do{if (findFileData.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY) {continue;}char sourceFile[MAX_PATH];sprintf(sourceFile, "%s\\%s", config.sourceFolder, findFileData.cFileName);//目标路径chardestPath[MAX_PATH];if (config.enableGameClassification){char gameName[MAX_PATH];ExtractGameName(findFileData.cFileName,gameName);sprintf(destPath,"%s\\%s",config.destinationRoot, gameName);//如果目标文件夹不存在,则创建if(!PathFileExists(destPath)){CreateDirectory(destPath,NULL);}sprintf(destPath,"%s\\%s",destPath, findFileData.cFileName);} else{sprintf(destPath, "%s\\%s", config.defaultDestination, findFileData.cFileName);}//移动文件(跨磁盘移动,系统会复制然后删除)if(MoveFile(sourceFile,destPath)) {printf("Moved:%s-> %s\n", sourceFile,destPath);} else{printf("Failedto move: %s (Error:%d)\n", sourceFile,GetLastError());}}while (FindNextFile(hFind,&findFileData) !=0);FindClose(hFind); }int main() {Configconfig =ReadConfig();//循环执行,每次等待指定的间隔while(1) {MoveFiles(config);Sleep(config.checkInterval*60 *1000);//转换为毫秒}return0; }``` 注意:上面的代码是简化版,实际中需要更多的错误处理。另外,`GetPrivateProfileDouble`不是标准函数,需要自己实现(读取字符串然后转换)。另外,文件名的解析规则可能需要根据实际情况调整。此外,我们还需要考虑:-如果移动过程中程序退出,如何避免文件丢失?建议在移动前先检查目标磁盘空间。-目标磁盘空间不足时,跳过移动。 改进:在移动每个文件前,检查目标磁盘的可用空间。```c//在MoveFiles函数中,移动文件前添加: DWORD freeBytesAvailable;if(!GetDiskFreeSpaceEx(config.destinationRoot,(PULARGE_INTEGER)&freeBytesAvailable,NULL,NULL)){//错误处理}//转换为MBdoublefreeSpaceMB =(double)freeBytesAvailable/ (1024.0*1024.0); if(freeSpaceMB< (fileSize/ (1024.0*1024.0))+10){ //文件大小加上10MB缓冲//空间不足,跳过continue; }``` 但是注意,我们已经在前面计算了总大小,但移动是逐个文件进行的,所以最好在移动每个文件前检查该文件的大小和目标磁盘的剩余空间(因为移动过程中剩余空间会变化)。因此,在移动每个文件之前,获取该文件的大小,然后检查目标磁盘的剩余空间是否大于该文件大小(加上一些缓冲)。修改移动文件循环:```c//...获取源文件路径和目标路径后//获取文件大小WIN32_FILE_ATTRIBUTE_DATA fileAttr;if (!GetFileAttributesEx(sourceFile, GetFileExInfoStandard, &fileAttr)) {continue;}ULONGLONGfileSize= ((ULONGLONG)fileAttr.nFileSizeHigh <<32) +fileAttr.nFileSizeLow;//获取目标磁盘的剩余空间ULARGE_INTEGER freeBytesAvailable;if(!GetDiskFreeSpaceEx(config.destinationRoot,&freeBytesAvailable,NULL,NULL)){continue;}//如果剩余空间小于文件大小(加10MB缓冲),则跳过if (freeBytesAvailable.QuadPart< fileSize +10*1024*1024) {printf("Insufficientspace ondestinationdisk forfile:%s\n",sourceFile);continue;}//移动文件if(MoveFile(sourceFile,destPath)) {printf("Moved:%s-> %s\n", sourceFile,destPath);} else{printf("Failed tomove:%s(Error: %d)\n",sourceFile, GetLastError());} ```这样,可以确保不会因为磁盘空间不足而失败。 用户配置:我们目前使用配置文件(config.ini),但用户可能希望从XboxGame Bar的设置界面进行配置。这需要开发一个XboxGame Bar插件,这涉及到UWP开发,与我们的C语言程序不同。因此,我们可以这样设计:-我们的C程序作为后台服务运行,读取配置文件。 -开发一个简单的UWP设置界面(使用C#),让用户修改配置文件,然后通知后台服务重新加载配置。 但是,题目要求用C语言,且是插件形式。Xbox GameBar的插件使用JavaScript和HTML开发(基于UWP),所以不能直接用C语言开发插件。因此,我们需要将C程序作为后台服务,然后插件通过某种方式(例如文件写入)修改配置。另一种思路:将配置存储在注册表或共享文件中,然后C程序读取。Xbox GameBar插件(JavaScript)可以写入注册表或文件。 考虑到简单性,我们使用配置文件,并让Xbox GameBar插件通过写入配置文件来修改配置。然后,我们的C程序需要监视配置文件的变化,并重新加载。 实现配置文件监视:使用`FindFirstChangeNotification`或`ReadDirectoryChangesW`来监视配置文件所在目录。由于我们主要关注配置文件,可以在每次循环检查时检查配置文件的最后修改时间,如果发生变化则重新加载。 在main函数中:```cintmain(){Config config=ReadConfig();FILETIME lastConfigWriteTime =GetFileModTime(CONFIG_FILE);while(1) {//检查配置文件是否被修改FILETIMEcurrentConfigWriteTime= GetFileModTime(CONFIG_FILE);if(CompareFileTime(&currentConfigWriteTime,&lastConfigWriteTime)!=0){config =ReadConfig();lastConfigWriteTime= currentConfigWriteTime;}MoveFiles(config);Sleep(config.checkInterval*60 *1000);}return0; }``` 其中`GetFileModTime`函数:```cFILETIMEGetFileModTime(const char* filename) {FILETIMEft ={0};HANDLEhFile= CreateFile(filename, GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);if(hFile !=INVALID_HANDLE_VALUE) {GetFileTime(hFile, NULL, NULL, &ft);CloseHandle(hFile);}returnft;} ```这样,当用户通过其他程序(如Xbox GameBar插件)修改配置文件后,我们的程序会重新加载配置。总结:我们设计了一个后台运行的C程序,定时检查源文件夹,当文件数量或总大小超过阈值时,将文件按游戏名称分类移动到目标磁盘,同时支持磁盘空间检测和低CPU优先级。注意:由于XboxGame Bar插件开发需要UWP技术,这里不展开,但我们可以提供一个简单的设置界面(HTML+JavaScript)让用户修改配置文件,并通过文件系统通知C程序重新加载配置。最后,我们需要将C程序编译为可执行文件,并设置为开机启动(或作为服务安装)。 §§相关问题§§1.如何确保在移动大文件时不影响游戏性能?2.如何扩展这个插件以支持多个目标磁盘?3.如果文件名中不包含游戏名称,如何获取录屏对应的游戏信息?</think>### Xbox Game Bar 录屏文件管理插件设计 #### 核心功能概述 1. **磁盘空间检测**:实时监控目标磁盘可用空间 2. **双模式支持**: - 默认模式:自动按预设规则移动文件 - 自定义模式:用户定义移动规则 3. **游戏分类**:根据游戏名称自动创建分类文件夹 4. **智能阈值**: - 文件大小阈值(默认 5GB) - 文件数量阈值(默认 50 个) 5. **CPU 优先级管理**:后台低优先级运行 6. **用户配置界面**:集成到 Xbox Game Bar 设置面板 --- ### 系统架构 ```mermaid graph TD A[Xbox Game Bar] --> B[插件配置界面] C[监控服务] --> D[文件扫描器] D --> E[规则引擎] E --> F[文件迁移器] G[磁盘空间检测] --> F H[游戏分类器] --> F F --> I[目标磁盘] ``` --- ### 配置文件设计 (`config.ini`) ```ini [General] ; 源文件夹路径 SourcePath=C:\Users\%USERNAME%\Videos\Captures ; 检查间隔(分钟) CheckInterval=10 [Thresholds] ; 文件总大小阈值(MB) MaxSize=5120 ; 文件数量阈值 MaxCount=50 [Destination] ; 默认目标磁盘 DefaultDisk=D:\GameCaptures ; 自定义规则路径 CustomRulesPath=C:\ProgramData\XboxPlugin\rules.json [Performance] ; CPU优先级 0=空闲 1=低 2=正常 CPUPriority=1 ; 最大CPU使用率(%) MaxCPUUsage=15 ``` --- ### C 语言核心代码实现 #### 主监控服务 (`main.c`) ```c #include <windows.h> #include <stdio.h> #include <shlwapi.h> #include "file_utils.h" #include "config_loader.h" DWORD WINAPI MonitorThread(LPVOID lpParam) { CONFIG config = LoadConfig("C:\\ProgramData\\XboxPlugin\\config.ini"); while (1) { // 检查文件阈值 if (CheckThresholds(config)) { // 获取磁盘空间信息 DISK_SPACE diskSpace = GetDiskSpace(config.DefaultDisk); if (diskSpace.freeGB > (config.MaxSize / 1024.0)) { // 执行文件迁移 ProcessFiles(config); } } // 低优先级休眠 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_IDLE); Sleep(config.CheckInterval * 60 * 1000); } return 0; } int main() { HANDLE hThread = CreateThread(NULL, 0, MonitorThread, NULL, 0, NULL); if (hThread) { WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); } return 0; } ``` #### 文件操作模块 (`file_utils.c`) ```c #include <windows.h> #include <stdio.h> #include <shlwapi.h> typedef struct { double totalGB; double freeGB; } DISK_SPACE; DISK_SPACE GetDiskSpace(LPCSTR drive) { DISK_SPACE space = {0}; ULARGE_INTEGER freeBytes, totalBytes; if (GetDiskFreeSpaceExA(drive, NULL, &totalBytes, &freeBytes)) { space.totalGB = (double)totalBytes.QuadPart / (1024*1024*1024); space.freeGB = (double)freeBytes.QuadPart / (1024*1024*1024); } return space; } BOOL MoveGameFile(LPCSTR source, LPCSTR gameName, CONFIG config) { char destPath[MAX_PATH]; sprintf(destPath, "%s\\%s\\%s", config.DefaultDisk, gameName, PathFindFileNameA(source)); // 创建游戏分类目录 CreateDirectoryA(destPath, NULL); // 移动文件(跨磁盘) return MoveFileWithProgressA( source, destPath, NULL, NULL, MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH ); } ``` #### 游戏分类器 (`classifier.c`) ```c #include <windows.h> #include <string.h> // 从文件名提取游戏名称: GameName_2023-06-15_12-30-45.mp4 char* ExtractGameName(LPCSTR filename) { char* copy = _strdup(filename); char* firstUnderscore = strchr(copy, '_'); if (firstUnderscore) { *firstUnderscore = '\0'; return copy; } return "Unknown"; } ``` --- ### 用户配置界面集成 通过 Xbox Game Bar 的插件 API 注册配置面板: ```c // 注册设置面板 HRESULT RegisterSettingsPanel() { IPluginSettings* pSettings; CoCreateInstance(CLSID_PluginSettings, NULL, CLSCTX_INPROC_SERVER, IID_IPluginSettings, (void**)&pSettings); pSettings->AddPanel(L"录屏管理器", L"XboxPlugin.SettingsPanel"); pSettings->Release(); return S_OK; } // 设置面板UI示例 void ShowSettingsUI() { // 显示阈值设置滑块 CreateSlider(L"文件大小阈值(MB)", 1024, 10240); CreateSlider(L"文件数量阈值", 10, 100); // 目标磁盘选择器 CreateDiskSelector(L"默认存储磁盘"); // CPU优先级选项 CreateDropdown(L"CPU优先级", L"空闲|低|正常", currentPriority); } ``` --- ### 安装与部署流程 1. **注册插件**: ```powershell reg add "HKCU\Software\Microsoft\GameBar" /v "AllowPlugins" /t REG_DWORD /d 1 /f reg add "HKCU\Software\Microsoft\GameBar\Plugins\{GUID}" /v "Path" /t REG_SZ /d "C:\Program Files\XboxPlugin\plugin.dll" ``` 2. **服务安装**: ```cmd sc create XboxFileMgr binPath= "C:\Program Files\XboxPlugin\service.exe" start= auto ``` 3. **权限配置**: ```xml <!-- manifest.xml --> <trustInfo> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> ``` --- ### 性能优化策略 1. **I/O 调度优化**: ```c // 设置低I/O优先级 SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN); ``` 2. **批量处理机制**: ```c #define BATCH_SIZE 5 while (filesToMove > 0) { int count = min(BATCH_SIZE, filesToMove); MoveFileBatch(files, count); Sleep(1000); // 防止磁盘拥塞 } ``` 3. **内存映射加速**: ```c HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, size, NULL); LPVOID pData = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, size); ``` --- ### 测试用例 ```gherkin 功能: 文件自动迁移 场景: 达到大小阈值 当 源文件夹大小 > 5GB 并且 目标磁盘空间 > 6GB 那么 自动迁移最早的文件到游戏分类目录 场景: 自定义规则优先 当 存在自定义规则 并且 文件名匹配规则 那么 迁移到规则指定位置 ``` [^1]: Xbox Game Bar 插件开发文档 - Microsoft Learn [^2]: Windows 文件系统监控最佳实践 - Windows Dev Center
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值