Каталог документов: удалите файл и переименуйте остальные файлы в Swift 4.2 - PullRequest
0 голосов
/ 11 января 2019

Это та же проблема, что и в этом посте SO: Как переименовать файлы в каталоге документов , но это мне совсем не помогло. Это единственный пост, с которым я столкнулся, который связан с моей проблемой.

У меня есть представление коллекции, где изображения добавляются через imagePickerController в didFinishPickingMediaWithInfo. Он проходит по каталогу документов и дает выбранному изображению имя в соответствии со следующим доступным индексным номером. Таким образом, изображения получают имя image1.jpg, image2.jpg и т. Д. Когда изображения загружаются в collectionView, я снова перебираю и показываю изображения в порядке индекса. Когда пришло время удалить изображение, я могу найти его в каталоге документов и удалить его, но затем порядок индексов прерывается, и я больше не могу загружать изображения. Таким образом, если я удаляю image3.png, каталог документов содержит image1.jpg, image2.jpg, image4.jpg, image5.jpg и т. Д.

Мой текущий код, который пытается переименовать или переместить изображения в каталоге, по-прежнему зацикливается на индексных числах и естественно останавливается, когда дело доходит до пустого индекса (image3.jpg). Как я могу заставить image4.jpg переместиться туда, где раньше находился image3.jpg (и переместить все другие изображения, которые следуют по индексу, где изображение было удалено)?

Я не могу полностью обдумать логику, необходимую для переименования файлов. Дайте мне знать, если вам нужно больше кода. Все предложения приветствуются. Вот что у меня сейчас:

@objc func tapToDelete(recognizer: UITapGestureRecognizer)
{

    let pointInCollectionView = recognizer.location(in: collectionView)
    let indexPath = collectionView.indexPathForItem(at: pointInCollectionView)

    countIndex = (indexPath?.row)! + 1

    let filepath = getFolderAndFilePath() //this gets the folder and filepath of each image


    let alert = UIAlertController(title: "Delete This Image?", message: "Are you sure? This cannot be undone.", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
    alert.addAction(UIAlertAction(title: "Delete", style: .destructive, handler: { (action) in
        do
        {
            try self.fileManager.removeItem(at: filepath as URL)
            self.imageArray.remove(at: self.countIndex)


            self.folderPath = self.getFolderPath()
            if self.folderPath != nil
            {
                var j = 0
                var z = 0
                var finalArray = [String]()

                do
                {
                    let directoryContent = try FileManager.default.contentsOfDirectory(at: self.folderPath! as URL, includingPropertiesForKeys: nil, options: [])


                    for _ in directoryContent
                    {
                        z += 1
                        let fileString = String(format: "image%d.jpg", z)
                        let oldPath = self.folderPath?.appendingPathComponent(fileString)
                        print("filename oldPath ?: \(String(describing: oldPath))")

                        if self.fileManager.fileExists(atPath: (oldPath?.path)!)
                        {
                            j += 1
                            let newFileName = String(format: "image%d.jpg", j)


                            finalArray.append(newFileName)

                            let newPath = oldPath?.deletingLastPathComponent().appendingPathComponent(newFileName)
                            print("new filename: \(String(describing: newFileName))")

                            _ = try? self.fileManager.moveItem(atPath: (oldPath?.path)!, toPath: (newPath?.path)!)

                        }
                        else
                        {
                            print("no file here")
                            //this is called when we get to the image removed(image3.jpg)
                        }
                        self.collectionView.reloadData() //this reloads the collectionview and updates the count but still shows image3 instead of image4 even though image3 has been removed from the directory
                    }
                }
                catch
                {
                    print("Could not search for urls of files in documents directory: \(error)")
                }
            }
        }
        catch
        {
            print(error)

        }

    }))
    self.present(alert, animated: true)
}

1 Ответ

0 голосов
/ 11 января 2019

Это может потребовать некоторой настройки, но как насчет следующего подхода (в псевдокоде) после удаления файла.

let directoryContent = try FileManager.default.contentsOfDirectory(at:   self.folderPath! as URL, includingPropertiesForKeys: nil, options: [])
var index = 1
var newImageArray:[URL] = []
for fileURL in directoryContent
{
    let newFileName = String(format: "image%d.jpg", index)
    let newFilePathURL = makePathAsYouWere()
    _ = try? self.fileManager.moveItem(atPath: fileURL, toPath: newFilePathURL)
    index += 1
    newImageArray.append(newFilePathURL)
}

self.imageArray = newImageArray

collectionView.reload()

По сути, после удаления файлов у вас будет набор файлов, по которым вы можете перебирать. Этот список, возможно, потребуется отсортировать, чтобы получить их в правильном порядке, но как только они отсортированы (файл1, файл2, файл4, файл5). Вы должны иметь возможность переименовывать каждую из них последовательно, чтобы вернуть их в числовом порядке без пробелов, поскольку описанный выше подход не заботится об индексе старого файла.

Для массива изображений вы должны просто иметь возможность создать новый с новыми путями файлов, которые вы создаете, заменить старый массив и затем запустить перезагрузку. При этом вам также не нужно удалять элемент delete из массива изображения, он будет удален при перестроении.

Дайте мне знать, достаточно ли этого для начала, иначе я могу попытаться собрать полностью проработанный пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...