AutoSaveManager.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. //
  2. // AutoSaveManager.swift
  3. // PDF Master
  4. //
  5. // Created by tangchao on 2023/11/8.
  6. //
  7. import Cocoa
  8. public let KAutoSaveTimeValueChangedNoti = "KAutoSaveTimeValueChangedNoti"
  9. class AutoSaveManager: NSObject {
  10. //APP是否允许进行自动缓存
  11. var autoSaveEnabled = false
  12. var timeInterval: CGFloat = 15
  13. /*
  14. @interface AutoSaveManager : NSObject
  15. @property (nonatomic, copy, readonly) NSString *autoSaveFolder;
  16. @property (nonatomic, strong, readonly) NSMutableArray *originalPaths;//保存的原文件信息
  17. @property (nonatomic, strong, readonly) NSMutableArray *autoSavePaths;//对应保存的信息
  18. @property (nonatomic, strong) NSMutableArray *opendPaths;//所有打开的文件信息汇总
  19. @property (nonatomic, assign) BOOL;
  20. @property (nonatomic, assign) BOOL autoSaveAlertShow;//防止重复弹出
  21. @property (nonatomic, assign) BOOL autoSaveDidEndAction;
  22. @property (nonatomic, assign) BOOL isSaving;//当前是否正在保存
  23. @property (nonatomic, assign) CGFloat ;
  24. + (AutoSaveManager *)manager;
  25. - (void)clearCache;
  26. - (NSString *)autoSaveWithPath:(NSString *)filePath;
  27. - (void)removeAutoSavePath:(NSString *)filePath;
  28. @end
  29. */
  30. static let manager = AutoSaveManager()
  31. /*
  32. @interface AutoSaveManager ()
  33. @property (nonatomic, strong) NSMutableDictionary *infoDict;
  34. @property (nonatomic, strong, readwrite) NSMutableArray *originalPaths;//保存的原文件信息
  35. @property (nonatomic, strong, readwrite) NSMutableArray *autoSavePaths;
  36. @property (nonatomic, copy, readwrite) NSString *autoSaveFolder;
  37. @end
  38. @implementation AutoSaveManager
  39. + (AutoSaveManager *)manager {
  40. static AutoSaveManager *__manager = nil;
  41. if (!__manager) {
  42. __manager = [[super allocWithZone:NULL] init];
  43. }
  44. return __manager;
  45. }
  46. + (instancetype)allocWithZone:(struct _NSZone *)zone {
  47. return AutoSaveManager.manager;
  48. }
  49. - (id)init {
  50. self = [super init];
  51. if (self) {
  52. self.autoSaveEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"ComAutoSaveKey"];
  53. if ([[NSUserDefaults standardUserDefaults] floatForKey:@"AutoSaveTimeIntervalKey"]) {
  54. self.timeInterval = [[NSUserDefaults standardUserDefaults] floatForKey:@"AutoSaveTimeIntervalKey"];
  55. } else {
  56. self.timeInterval = 15;
  57. }
  58. [self loadData];
  59. self.autoSaveDidEndAction = YES;
  60. }
  61. return self;
  62. }
  63. - (void)loadData {
  64. NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
  65. if ([[NSFileManager defaultManager] fileExistsAtPath:[cachesPath stringByAppendingPathComponent:[NSBundle mainBundle].bundleIdentifier]]) {
  66. cachesPath = [cachesPath stringByAppendingPathComponent:[NSBundle mainBundle].bundleIdentifier];
  67. }
  68. cachesPath = [cachesPath stringByAppendingPathComponent:@"autoSaveFolder"];
  69. if (![[NSFileManager defaultManager] fileExistsAtPath:cachesPath]) {
  70. [[NSFileManager defaultManager] createDirectoryAtPath:cachesPath withIntermediateDirectories:YES attributes:nil error:nil];
  71. }
  72. self.autoSaveFolder = cachesPath;
  73. #if DEBUG
  74. NSLog(@"autoSaveFolder===%@",cachesPath);
  75. #endif
  76. NSString *plistPath = [NSString stringWithFormat:@"%@/autoSaveInfo.plist",self.autoSaveFolder];
  77. NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
  78. if (dict.allKeys.count == 0) {
  79. return;
  80. }
  81. self.infoDict = dict;
  82. if (!self.autoSavePaths) {
  83. self.autoSavePaths = [[NSMutableArray alloc] init];
  84. }
  85. if (!self.originalPaths) {
  86. self.originalPaths = [[NSMutableArray alloc] init];
  87. }
  88. [self.originalPaths addObjectsFromArray:dict.allKeys];
  89. self.opendPaths = [[NSMutableArray alloc] init];
  90. NSArray *arr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.autoSaveFolder error:nil];
  91. for (NSString *fileName in arr) {
  92. NSString *savedKey = [self.autoSaveFolder stringByAppendingPathComponent:fileName];
  93. if ([dict.allValues containsObject:savedKey]) {
  94. [self.autoSavePaths addObject:savedKey];
  95. }else {
  96. if ([fileName isEqualToString:@"autoSaveInfo.plist"]) {
  97. } else {
  98. [[NSFileManager defaultManager] removeItemAtPath:savedKey error:nil];
  99. }
  100. }
  101. }
  102. }
  103. #pragma mark - Setter
  104. - (void)setAutoSaveEnabled:(BOOL)autoSaveEnabled {
  105. _autoSaveEnabled = autoSaveEnabled;
  106. [[NSUserDefaults standardUserDefaults] setBool:_autoSaveEnabled forKey:@"ComAutoSaveKey"];
  107. [[NSUserDefaults standardUserDefaults] synchronize];
  108. }
  109. - (void)setTimeInterval:(CGFloat)timeInterval {
  110. _timeInterval = timeInterval;
  111. [[NSUserDefaults standardUserDefaults] setFloat:_timeInterval forKey:@"AutoSaveTimeIntervalKey"];
  112. [[NSUserDefaults standardUserDefaults] synchronize];
  113. }
  114. - (NSString *)URLEncodedString:(NSString *)string {
  115. CFStringRef stringRef = CFBridgingRetain(string);
  116. #pragma clang diagnostic push
  117. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  118. CFStringRef encoded = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
  119. stringRef,
  120. NULL,
  121. CFSTR("!*'\"();:@&=+$,/?%#[]% "),
  122. kCFStringEncodingUTF8);
  123. #pragma clang diagnostic pop
  124. CFRelease(stringRef);
  125. return CFBridgingRelease(encoded);
  126. }
  127. - (NSString *)getValidFilePath:(NSString *)oldPath {
  128. NSFileManager *fileManager = [NSFileManager defaultManager];
  129. NSDictionary *fileDic = [fileManager attributesOfItemAtPath:oldPath error:nil];
  130. NSString *fileType = [fileDic objectForKey:NSFileType];
  131. int i =1;
  132. NSString *newPath = oldPath;
  133. while ([fileManager fileExistsAtPath:newPath]) {
  134. if ([fileType isEqualToString:NSFileTypeDirectory]) {
  135. newPath = [oldPath stringByAppendingFormat:@"(%d)",i];
  136. } else {
  137. NSString *fileExtension = [oldPath pathExtension];
  138. newPath = [[oldPath stringByDeletingPathExtension] stringByAppendingFormat:@"(%d).%@",i,fileExtension];
  139. }
  140. i++;
  141. }
  142. return newPath;
  143. }
  144. #pragma mark - Public Method
  145. - (void)clearCache {
  146. if ([[NSFileManager defaultManager] fileExistsAtPath:self.autoSaveFolder]) {
  147. [[NSFileManager defaultManager] removeItemAtPath:self.autoSaveFolder error:nil];
  148. }
  149. if (![[NSFileManager defaultManager] fileExistsAtPath:self.autoSaveFolder]) {
  150. [[NSFileManager defaultManager] createDirectoryAtPath:self.autoSaveFolder withIntermediateDirectories:YES attributes:nil error:nil];
  151. }
  152. }
  153. - (NSString *)autoSaveWithPath:(NSString *)filePath {
  154. NSString *autoSaveFolder = self.autoSaveFolder;
  155. NSString *plistPath = [NSString stringWithFormat:@"%@/autoSaveInfo.plist",autoSaveFolder];
  156. NSString *savePath = [NSString stringWithFormat:@"%@/%@_%@.%@",autoSaveFolder,filePath.lastPathComponent.stringByDeletingPathExtension,@"recovered",filePath.pathExtension];
  157. if ([[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
  158. NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
  159. if ([dict.allKeys containsObject:filePath]) {
  160. savePath = [dict valueForKey:filePath];
  161. }
  162. if (savePath.length > 0 && filePath.length > 0) {
  163. if ([dict.allValues containsObject:savePath]) {
  164. //不同路径下同名文件的保存覆盖的情况处理
  165. NSArray *values = [[NSArray alloc] initWithArray:dict.allValues];
  166. for (NSString *key in dict.allKeys) {
  167. NSString *value = [dict objectForKey:key];
  168. if ([savePath isEqualToString:value] &&
  169. ![key isEqualToString:filePath]) {
  170. int count = 1;
  171. savePath = [NSString stringWithFormat:@"%@/%@_%@(%d).%@",autoSaveFolder,filePath.lastPathComponent.stringByDeletingPathExtension,@"recovered",count,filePath.pathExtension];
  172. while ([values containsObject:savePath]) {
  173. count ++;
  174. savePath = [NSString stringWithFormat:@"%@/%@_%@(%d).%@",autoSaveFolder,filePath.lastPathComponent.stringByDeletingPathExtension,@"recovered",count,filePath.pathExtension];
  175. }
  176. }
  177. }
  178. }
  179. [dict setValue:savePath forKey:filePath];
  180. }
  181. [dict writeToURL:[NSURL fileURLWithPath:plistPath] error:nil];
  182. } else {
  183. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  184. if (savePath.length > 0 && filePath.length > 0) {
  185. [dict setValue:savePath forKey:filePath];
  186. }
  187. [dict writeToURL:[NSURL fileURLWithPath:plistPath] error:nil];
  188. }
  189. return savePath;
  190. }
  191. - (void)removeAutoSavePath:(NSString *)filePath {
  192. NSString *autoSaveFolder = self.autoSaveFolder;
  193. NSString *plistPath = [NSString stringWithFormat:@"%@/autoSaveInfo.plist",autoSaveFolder];
  194. if ([[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
  195. NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
  196. if ([dict valueForKey:filePath]) {
  197. NSString *savePath = [dict valueForKey:filePath];
  198. if ([[NSFileManager defaultManager] fileExistsAtPath:savePath]) {
  199. [[NSFileManager defaultManager] removeItemAtPath:savePath error:nil];
  200. }
  201. [dict removeObjectForKey:filePath];
  202. }
  203. if (dict.allKeys.count > 0) {
  204. [dict writeToURL:[NSURL fileURLWithPath:plistPath] error:nil];
  205. } else {
  206. [[NSFileManager defaultManager] removeItemAtPath:plistPath error:nil];
  207. }
  208. }
  209. }
  210. @end
  211. */
  212. }