status_t trash(const char *f) { status_t err; attr_info ai; dev_t dev = -1; int nr; const char *original_path; char trash_dir[B_PATH_NAME_LENGTH]; char trashed_file[B_PATH_NAME_LENGTH]; dev = dev_for_path(f); err = find_directory(B_TRASH_DIRECTORY, dev, false, trash_dir, B_PATH_NAME_LENGTH); if (err < 0) return err; BNode node(f); err = node.InitCheck(); if (err < 0) return err; err = node.GetAttrInfo(kAttrOriginalPath, &ai); if (err == B_OK) return EALREADY; if (!strncmp(f, trash_dir, strlen(trash_dir))) return EALREADY; entry_ref er; err = get_ref_for_path(f, &er); if (err < 0) return err; BPath orgPath(&er); err = orgPath.InitCheck(); if (err < 0) return err; original_path = orgPath.Path(); BDirectory trashDir(trash_dir); err = trashDir.InitCheck(); if (err < 0) return err; for (nr = 0; ; nr++) { if (nr > INT_MAX - 1) return B_ERROR; if (nr) snprintf(trashed_file, B_PATH_NAME_LENGTH-1, "%s/%s %d", trash_dir, er.name, nr); else snprintf(trashed_file, B_PATH_NAME_LENGTH-1, "%s/%s", trash_dir, er.name); if (!trashDir.Contains(trashed_file)) break; } err = rename(original_path, trashed_file); if (err < 0) return err; err = node.WriteAttr(kAttrOriginalPath, B_STRING_TYPE, 0LL, original_path, strlen(original_path)+1); if (err < 0) return err; return 0; }
BString ScreenshotWindow::_FindValidFileName(const char* name) { BString baseName(name); if (!fExtension.IsEmpty()) baseName.RemoveLast(fExtension); if (!fLastSelectedPath) return baseName; BPath orgPath(_GetDirectory()); if (orgPath == NULL) return baseName; fExtension = fUtility.FileNameExtension(fImageFileType); BPath outputPath = orgPath; BString fileName; fileName << baseName << fExtension; outputPath.Append(fileName); if (!BEntry(outputPath.Path()).Exists()) return fileName; if (baseName.FindFirst(B_TRANSLATE_NOCOLLECT( fUtility.sDefaultFileNameBase)) == 0) baseName.SetTo(fUtility.sDefaultFileNameBase); BEntry entry; int32 index = 1; do { fileName = ""; fileName << baseName << index++ << fExtension; outputPath.SetTo(orgPath.Path()); outputPath.Append(fileName); entry.SetTo(outputPath.Path()); } while (entry.Exists()); return fileName; }