ClearCachesTool.h

//
//  ClearCachesTool.h
//  demo
//
//  Created by zhouyu on 2016/12/27.
//  Copyright © 2016年 demo. All rights reserved.
/** 真机和模拟器下WKWebKit下载的图片资源缓存路径不一样* 真机:/Library/Caches/WebKit* 模拟器:/Library/Caches/cn.demo.demo/WebKit* cn.demo.demo是指APP的Boundle Identifier* 真机清理Cache缓存有坑,Snapshots文件夹无操作权限,导致清理失败,提供的方法中已经做了过滤处理*/#import <Foundation/Foundation.h>@interface ClearCachesTool : NSObject#pragma mark - 计算和清理Cache文件夹总缓存
/*s**  获取Cache文件夹缓存的总大小(Snapshots除外,没有权限获取)**  @param path 要获取的文件夹 路径**  @return 返回path路径下文件夹的大小*/
+ (NSString *)getCacheSize;/***  获取Cache文件夹缓存的总大小(Snapshots除外,没有权限获取)*  @return 是否清除成功*/
+ (BOOL)clearCache;
+ (void)readyClearCache;#pragma mark - 计算和清理指定路径文件夹总缓存
/*s**  获取path路径下文件夹的大小**  @param path 要获取的文件夹 路径**  @return 返回path路径下文件夹的大小*/
+ (NSString *)getCacheSizeWithFilePath:(NSString *)path;/***  清除path路径下文件夹的缓存**  @param path  要清除缓存的文件夹 路径**  @return 是否清除成功*/
+ (BOOL)clearCacheWithFilePath:(NSString *)path;#pragma mark - 计算和清理WebKit文件夹的WKWebKit总缓存
/*s**  获取WKWebKit路径下文件夹的大小*  @return 返回WKWebKit路径下文件夹的大小*/
+ (NSString *)getWKWebKitCacheSize;/***  清除WKWebKit路径下文件夹的缓存*  @return 是否清除成功*/
+ (BOOL)clearWKWebKitCache;#pragma mark - 计算和清理SDImageCache--default文件夹的总缓存
/*s**  获取SDImageCache--default路径下文件夹的大小*  @return 返回WKWebKit路径下文件夹的大小*/
+ (NSString *)getSDImageDefaultCacheSize;/***  清除SDImageCache--default路径下文件夹的缓存*  @return 是否清除成功*/
+ (BOOL)clearSDImageDefaultCache;#pragma mark - MAC电脑模拟器下计算和清理WebKit文件夹的WKWebKit总缓存
/*s**  获取模拟器下WKWebKit路径下文件夹的大小*  @return 返回WKWebKit路径下文件夹的大小*/
+ (NSString *)getSimulatorWKWebKitCacheSize;/***  清除模拟器下WKWebKit路径下文件夹的缓存*  @return 是否清除成功*/
+ (BOOL)clearSimulatorWKWebKitCache;@end

ClearCachesTool.m

//
//  ClearCachesTool.m
//  demo
//
//  Created by zhouyu on 2016/12/27.
//  Copyright © 2016年 demo. All rights reserved.
//#import "ClearCachesTool.h"@implementation ClearCachesTool#pragma mark - 获取Cache文件夹大小
+ (NSString *)getCacheSize {NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];NSString *totleSize = [ClearCachesTool getCacheSizeWithFilePath:cachesPath];return totleSize;
}#pragma mark - 删除Cache文件夹中的缓存
+ (BOOL)clearCache {NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];BOOL isAlreadyClearCache = [ClearCachesTool clearCacheWithFilePath:cachesPath];return isAlreadyClearCache;
}
+ (void)readyClearCache {BOOL isClearCache = [ClearCachesTool clearCache];if (isClearCache) {ZYLog(@"清理完毕");} else {ZYLog(@"清理失败");}
}#pragma mark - 计算和清理WebKit文件夹的WKWebKit总缓存
+ (NSString *)getWKWebKitCacheSize {NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];NSString *path = [cachesPath stringByAppendingPathComponent:@"/WebKit"];// 获取“path”文件夹下的所有文件NSArray *subPathArr = [[NSFileManager defaultManager] subpathsAtPath:path];NSString *filePath  = nil;NSInteger totleSize = 0;for (NSString *subPath in subPathArr){// 1. 拼接每一个文件的全路径filePath =[path stringByAppendingPathComponent:subPath];
//        ZYLog(@"%@",filePath);// 2. 是否是文件夹,默认不是BOOL isDirectory = NO;// 3. 判断文件是否存在BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory];// 4. 以上判断目的是忽略不需要计算的文件if (!isExist || isDirectory || [filePath containsString:@".DS"]){// 过滤: 1. 文件夹不存在  2. 过滤文件夹  3. 隐藏文件continue;}// 5. 指定路径,获取这个路径的属性NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];/**attributesOfItemAtPath: 文件夹路径该方法只能获取文件的属性, 无法获取文件夹属性, 所以也是需要遍历文件夹的每一个文件的原因*/// 6. 获取每一个文件的大小NSInteger size = [dict[@"NSFileSize"] integerValue];// 7. 计算总大小totleSize += size;}//8. 将文件夹大小转换为 M/KB/BNSString *totleStr = nil;if (totleSize > 1000 * 1000){totleStr = [NSString stringWithFormat:@"%.2fM",totleSize / 1000.00f /1000.00f];}else if (totleSize > 1000){totleStr = [NSString stringWithFormat:@"%.2fKB",totleSize / 1000.00f ];}else{totleStr = [NSString stringWithFormat:@"%.2fB",totleSize / 1.00f];}return totleStr;
}+ (BOOL)clearWKWebKitCache {NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];NSString *path = [cachesPath stringByAppendingPathComponent:@"/WebKit"];//拿到path路径的下一级目录的子文件夹NSArray *subPathArr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];NSString *filePath = nil;NSError *error = nil;for (NSString *subPath in subPathArr) {filePath = [path stringByAppendingPathComponent:subPath];
//        ZYLog(@"%@",filePath);if (![filePath containsString:@"/Caches/Snapshots"]) {//删除子文件夹[[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];}if (error) {ZYLog(@"%@",error);return NO;}}return YES;
}#pragma mark - 计算和清理SDImageCache--default文件夹的总缓存
+ (NSString *)getSDImageDefaultCacheSize {NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];NSString *path = [cachesPath stringByAppendingPathComponent:@"/default"];// 获取“path”文件夹下的所有文件NSArray *subPathArr = [[NSFileManager defaultManager] subpathsAtPath:path];NSString *filePath  = nil;NSInteger totleSize = 0;for (NSString *subPath in subPathArr){// 1. 拼接每一个文件的全路径filePath =[path stringByAppendingPathComponent:subPath];
//        ZYLog(@"%@",filePath);// 2. 是否是文件夹,默认不是BOOL isDirectory = NO;// 3. 判断文件是否存在BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory];// 4. 以上判断目的是忽略不需要计算的文件if (!isExist || isDirectory || [filePath containsString:@".DS"]){// 过滤: 1. 文件夹不存在  2. 过滤文件夹  3. 隐藏文件continue;}// 5. 指定路径,获取这个路径的属性NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];/**attributesOfItemAtPath: 文件夹路径该方法只能获取文件的属性, 无法获取文件夹属性, 所以也是需要遍历文件夹的每一个文件的原因*/// 6. 获取每一个文件的大小NSInteger size = [dict[@"NSFileSize"] integerValue];// 7. 计算总大小totleSize += size;}//8. 将文件夹大小转换为 M/KB/BNSString *totleStr = nil;if (totleSize > 1000 * 1000){totleStr = [NSString stringWithFormat:@"%.2fM",totleSize / 1000.00f /1000.00f];}else if (totleSize > 1000){totleStr = [NSString stringWithFormat:@"%.2fKB",totleSize / 1000.00f ];}else{totleStr = [NSString stringWithFormat:@"%.2fB",totleSize / 1.00f];}return totleStr;
}+ (BOOL)clearSDImageDefaultCache {NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];NSString *path = [cachesPath stringByAppendingPathComponent:@"/default"];//拿到path路径的下一级目录的子文件夹NSArray *subPathArr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];NSString *filePath = nil;NSError *error = nil;for (NSString *subPath in subPathArr) {filePath = [path stringByAppendingPathComponent:subPath];
//        ZYLog(@"%@",filePath);if (![filePath containsString:@"/Caches/Snapshots"]) {//删除子文件夹[[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];}if (error) {ZYLog(@"%@",error);return NO;}}return YES;
}#pragma mark - 获取path路径下文件夹大小
+ (NSString *)getCacheSizeWithFilePath:(NSString *)path {// 获取“path”文件夹下的所有文件NSArray *subPathArr = [[NSFileManager defaultManager] subpathsAtPath:path];NSString *filePath  = nil;NSInteger totleSize = 0;for (NSString *subPath in subPathArr){
//        ZYLog(@"getCacheSize = %@",subPath);// 0. 把Snapshots文件夹过滤掉,没有访问权限,否则删除时操过200M会失败!!!!!!!!if (![subPath containsString:@"Snapshots"]) {// 1. 拼接每一个文件的全路径filePath =[path stringByAppendingPathComponent:subPath];}// 2. 是否是文件夹,默认不是BOOL isDirectory = NO;// 3. 判断文件是否存在BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory];// 4. 以上判断目的是忽略不需要计算的文件if (!isExist || isDirectory || [filePath containsString:@".DS"]){// 过滤: 1. 文件夹不存在  2. 过滤文件夹  3. 隐藏文件continue;}// 5. 指定路径,获取这个路径的属性NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];/**attributesOfItemAtPath: 文件夹路径该方法只能获取文件的属性, 无法获取文件夹属性, 所以也是需要遍历文件夹的每一个文件的原因*/// 6. 获取每一个文件的大小NSInteger size = [dict[@"NSFileSize"] integerValue];// 7. 计算总大小totleSize += size;}//8. 将文件夹大小转换为 M/KB/BNSString *totleStr = nil;if (totleSize > 1000 * 1000){totleStr = [NSString stringWithFormat:@"%.2fM",totleSize / 1000.00f /1000.00f];}else if (totleSize > 1000){totleStr = [NSString stringWithFormat:@"%.2fKB",totleSize / 1000.00f ];}else{totleStr = [NSString stringWithFormat:@"%.2fB",totleSize / 1.00f];}return totleStr;
}#pragma mark - 清除path文件夹下缓存大小--/Caches/Snapshots,真机测试会输出error
//Error Domain=NSCocoaErrorDomain Code=513 "未能移除“Snapshots”,因为您没有访问它的权限。"
+ (BOOL)clearCacheWithFilePath:(NSString *)path{//拿到path路径的下一级目录的子文件夹NSArray *subPathArr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];NSString *filePath = nil;NSError *error = nil;for (NSString *subPath in subPathArr) {filePath = [path stringByAppendingPathComponent:subPath];
//        ZYLog(@"%@",filePath);if (![filePath containsString:@"/Caches/Snapshots"]) {//删除子文件夹[[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];}if (error) {ZYLog(@"%@",error);return NO;}}return YES;
}#pragma mark - 模拟器下计算和清理WebKit文件夹的WKWebKit总缓存
+ (NSString *)getSimulatorWKWebKitCacheSize {NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];
//    ZYLog(@"%@",identifier);NSString *path = [NSString stringWithFormat:@"%@/%@",cachesPath,identifier];path = [path stringByAppendingPathComponent:@"/WebKit"];
//    ZYLog(@"%@",path);// 获取“path”文件夹下的所有文件NSArray *subPathArr = [[NSFileManager defaultManager] subpathsAtPath:path];NSString *filePath  = nil;NSInteger totleSize = 0;for (NSString *subPath in subPathArr){// 1. 拼接每一个文件的全路径filePath =[path stringByAppendingPathComponent:subPath];
//        ZYLog(@"%@",filePath);// 2. 是否是文件夹,默认不是BOOL isDirectory = NO;// 3. 判断文件是否存在BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory];// 4. 以上判断目的是忽略不需要计算的文件if (!isExist || isDirectory || [filePath containsString:@".DS"]){// 过滤: 1. 文件夹不存在  2. 过滤文件夹  3. 隐藏文件continue;}// 5. 指定路径,获取这个路径的属性NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];/**attributesOfItemAtPath: 文件夹路径该方法只能获取文件的属性, 无法获取文件夹属性, 所以也是需要遍历文件夹的每一个文件的原因*/// 6. 获取每一个文件的大小NSInteger size = [dict[@"NSFileSize"] integerValue];// 7. 计算总大小totleSize += size;}//8. 将文件夹大小转换为 M/KB/BNSString *totleStr = nil;if (totleSize > 1000 * 1000){totleStr = [NSString stringWithFormat:@"%.2fM",totleSize / 1000.00f /1000.00f];}else if (totleSize > 1000){totleStr = [NSString stringWithFormat:@"%.2fKB",totleSize / 1000.00f ];}else{totleStr = [NSString stringWithFormat:@"%.2fB",totleSize / 1.00f];}return totleStr;
}+ (BOOL)clearSimulatorWKWebKitCache {NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];//    ZYLog(@"%@",identifier);NSString *path = [NSString stringWithFormat:@"%@/%@",cachesPath,identifier];path = [path stringByAppendingPathComponent:@"/WebKit"];//    ZYLog(@"%@",path);//拿到path路径的下一级目录的子文件夹NSArray *subPathArr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];NSString *filePath = nil;NSError *error = nil;for (NSString *subPath in subPathArr) {filePath = [path stringByAppendingPathComponent:subPath];
//        ZYLog(@"%@",filePath);if (![filePath containsString:@"/Caches/Snapshots"]) {//删除子文件夹[[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];}if (error) {ZYLog(@"%@",error);return NO;}}return YES;
}@end

WOCOSetMyInfosController.m

//
//  WOCOSetMyInfosController.m
//  demo
//
//  Created by zhouyu on 2016/12/27.
//  Copyright © 2016年 demo. All rights reserved.
//#import "WOCOSetMyInfosController.h"
#import "ClearCachesTool.h"
#import "SVProgressHUD.h"@interface WOCOSetMyInfosController ()
/***  caches文件夹下缓存大小*/
@property (nonatomic, copy) NSString *cachesSize;
@end@implementation WOCOSetMyInfosController- (void)viewDidLoad {[super viewDidLoad];self.navigationItem.title = @"设置";self.tableView.backgroundColor = [UIColor whiteColor];self.tableView.scrollEnabled = NO;[self getCachesSize];
}#pragma mark - 获取Caches文件夹缓存大小
- (void)getCachesSize {// 子线程计算文件缓存dispatch_async(dispatch_get_global_queue(0, 0), ^{NSString *cachesSize = [ClearCachesTool getCacheSize];self.cachesSize = cachesSize;// 主线程更新显示dispatch_async(dispatch_get_main_queue(), ^{NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];cell.detailTextLabel.text = cachesSize;[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];[self.tableView deselectRowAtIndexPath:indexPath animated:YES];});});
}#pragma mark - 删除Caches文件夹缓存
- (void)clearCaches {// 子线程做删除耗时操作if (self.cachesSize == nil) {return;}NSString *message = [NSString stringWithFormat:@"缓存大小为%@,确定要清理吗?",self.cachesSize];UIAlertController *alertC = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];UIAlertAction *certain = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {[SVProgressHUD showWithStatus:@"正在拼命清理中..."];dispatch_async(dispatch_get_global_queue(0, 0), ^{[ClearCachesTool clearCache];// 主线程刷新显示dispatch_async(dispatch_get_main_queue(), ^{[SVProgressHUD dismiss];NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];self.cachesSize = nil;cell.detailTextLabel.text = @"清理完毕";[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];[self.tableView deselectRowAtIndexPath:indexPath animated:YES];});});}];[alertC addAction:cancel];[alertC addAction:certain];[self presentViewController:alertC animated:YES completion:nil];
}- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {[tableView deselectRowAtIndexPath:indexPath animated:YES];if (indexPath.row == 0) {[self clearCaches];}
}#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *ID = @"cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];}if (indexPath.section == 0 && indexPath.row == 0) {cell.textLabel.text = @"清理缓存";cell.detailTextLabel.text = @"正在计算中...";}else {cell.textLabel.text = [NSString stringWithFormat:@"%ld",(long)indexPath.section];cell.detailTextLabel.text = @"^_^";}cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;return cell;
}@end

效果

IOS 开发 Cache文件夹缓存的清理封装(包括WebKit缓存/SDImageCache缓存),都提供了相应的接口.相关推荐

  1. 1k文件夹快捷方式病毒清理

    来源:http://bbs.ikaka.com/showtopic-8665656.aspx "1k文件夹快捷方式病毒"是个.vbs+数据流双料病毒(病毒的数据流部分只在NTFS分 ...

  2. .net core 监听文件夹变化, FileSystemWatcher 封装

    功能: .net core 监听文件夹变化, FileSystemWatcher 封装 问题1:复制一个新文件能正常运行,但是复制第二个文件的时候就报一个文件正被其他线程占用无法打开的异常?The p ...

  3. android 电话录音保存到什么位置,手机的录音文件在哪个文件夹?不同的安卓手机存放的路径你都知道吗?...

    想必大家都有过在手机上进行录音的需求,记录一些比较重要的通话内容或信息,在完成录音后,你知道手机的录音文件存放在哪个文件夹了吗?下面小编将给大家介绍不同的安卓手机存放通话录音文件的路径,帮你轻松找到所 ...

  4. iOS开发——cache自动清理方案探索

    有效的本地 cache 机制,可以避免不必要的重复网络加载,不仅能提高相关应用场景的资源加载速度,也可以避免不必要的流量浪费造成用户损失.但是,由于缓存一般做法是通过 url 经过 md5 变换的值作 ...

  5. ios 获取沙河文件夹_iOS开发之获取沙盒路径

    iOS开发之沙盒机制(SandBox)详细讲解了沙盒的一些机制.在开发中,我们需要对沙盒进行操作,所以我们需要获取到沙盒路径. 沙盒里的文件夹包括Documents.Library.tmp.这三个文件 ...

  6. C盘清理——“C:\ProgramData\Package Cache“文件夹转移

    1.查看C盘内存占用情况: C盘在使用的时候常常发现不够用,就需要查看哪些文件可以删除或者可以转移.先可以使用SpaceSniffer来查看各个文件夹的大小,一目了然. 2.确认"C:\Pr ...

  7. ios 获取沙河文件夹_关于 iOS 沙盒的目录结构和获取

    沙盒目录结构 1. /xxName.app 应用程序的程序包目录,包含应用程序的本身. 2. /Documents/ 保存应用程序的重要数据文件和用户数据文件等.用户数据基本上都放在这个位置(例如从网 ...

  8. C:\WINDOWS\Installer文件夹的安全清理

    这几天微软发布了不少补丁,系统盘(C:\)又开始空间告警. 没办法又要研究一下哪些空间是可以释放的,我的C:\分配了10G的空间,一度又一度的空间紧张,大家的系统盘是多大呢? 这一次我准备向 C:\W ...

  9. ets5怎么找到数据文件夹_mac怎么清理磁盘空间?如何找到并清理Mac电脑“其他”文件?...

    相信大部分的Mac电脑用户都会有一个疑问,那就是"关于本机"中的那个"其他"类型到底是什么?为什么占据了那么大的磁盘空间,而在目前SSD固态硬盘空间有限的情况下 ...

  10. QQ图片文件夹说明及清理

    C2C(个人与好友之间的图片传输,清空与否依照个人意愿) Group(群组之间的图片传输,很乱建议全部清空) MarktingMsgCachePic(Markting+Msg+Cache+Pic意思是 ...

最新文章

  1. 查询oracle模式对象信息,ORACLE 模式和模式对象
  2. 深度学习在阿里B2B电商推荐系统中的实践
  3. 人工智能为人们减肥操碎了心
  4. Javascript 是如何体现继承的 ?
  5. mysql_config_editor程序的用法
  6. 再温暖的鸡汤不如一场殊死的战争,诸神之战四赛区冠军出炉!
  7. python实现文件下载-Python实现HTTP协议下的文件下载方法总结
  8. The Longest Increasing Subsequence (LIS)
  9. 关于如何提高SQL Server Compact的查询性能
  10. 栈和队列(python代码)
  11. Spring 中的如何自定义事件处理(Custom Event)
  12. 数据库怎么看是什么编码_离婚了怎么发朋友圈?看你喜欢什么类型
  13. 求1~n这n个整数十进制表示中1出现的次数
  14. BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理
  15. 使用systemd来构建你的服务
  16. Android系统架构与系统源码目录
  17. iOS-QQ音乐播放器的简单实现
  18. Java+SSM(Spring+SpringMVC+Mybatis)个性化购物商城推荐系统 电子商务推荐系统 基于用户、项目、聚类、混合的协同过滤推荐算法WebShopRSMEx 源代码下载
  19. PROE CREO 各类3D模型图档大全-8.2G
  20. Linux:配置tomcat

热门文章

  1. Docker 配置容器固定IP
  2. 魏德米勒端子eplan宏_Weidmüller Configurator 魏德米勒端子配置软件
  3. 华为eNSP静态路由下一跳实验
  4. 【WPS技能】xlsx表格根据单元格的值改变行背景色
  5. android 多个 前台 挂机,安卓手机如何进行多开挂机?
  6. icloud 照片同步_如何确保Mac和iPhone的照片同步到iCloud
  7. 看完就能学会如何使用热敏电阻!
  8. 在北京这种城市,周末假期怎么整才算浪......
  9. 计算机管理能看到移动硬盘,无法识别移动硬盘并且不显示磁盘图标.
  10. 浅层与深层、局部与全局、低级与高级特征的辨析