Попытка вывести список файлов по расширению *.json. Создание экземпляра префаба под родителем, но он не будет упорядочен. Есть ли способ обновить список или упорядочить их в порядке возрастания. Цель состоит в том, чтобы загрузить и удалить файлы. Как упорядочить файлы 1,2, 3,4,5... а если там 10 файлов последний сохраненный файл должен там спуститься на 10 место под родителем?
Dictionary<int, Button> BtnList = new Dictionary<int, Button>();
public static FileInfo[] info;
GameObject lisobj;
public void ListMap()
{
panellist.SetActive(true);
string mainpath = Application.persistentDataPath;
DirectoryInfo dir = new DirectoryInfo(mainpath);
info = dir.GetFiles("*.json");
for(int i = 1;i<=info.Length;i++)
{
lisobj = Instantiate(prefabpanellist);
lisobj.transform.SetParent(Parentcontent);
number.text = i.ToString();
mapnamedb.text =info[i-1].Name;
var button = lisobj.GetComponentInChildren<Button>();
BtnList.Add(i,button);
}
lisobj.transform.SetParent(Parentcontent);
Dictionary<int, Button>.ValueCollection values = BtnList.Values;
foreach (Button btn in values)
{
btn.onClick.AddListener(() => Deleteinformation());
}
}
public void Deleteinformation()
{
var b= UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject.GetComponent<Button>();
var mykey=BtnList.FirstOrDefault(x=>x.Value==b).Key;
Debug.Log("Items are" + mykey);
string mainpath = Application.persistentDataPath;
Debug.Log("Name is " + info[mykey - 1].Name);
//File.Delete(mainpath + info[mykey-1].);
}
Первоначально, когда я сохраняю файл в формате .json и нажимаю кнопку Listmap (чтобы отобразить список файлов, показанный на снимке экрана). Он показывает номер индекса 5 два раза. Кроме того, последний файл, который я сохранил, был назван «00000.json», но он стал первым файлом. То есть после того, как я его сохранил (список файлов), он не обновляется. Когда я нажимаю Listmap, файлы показывают один и тот же номер индекса несколько раз. Кажется, что он не обновляется, не уверен. последний сохраненный файл появляется сверху.
Информация @BugFinder = dir.GetFileSystemInfos(); Как получить файлы .JSON, используя это?
это не тот вопрос, который вы задавали. Вы спросили, как перечислить их в порядке возрастания... что является дубликатом того, что я перечислил
так же..у него тоже есть перегрузка GetFileSystemInfos(string)
где можно передать *.json
в
@BugFinder Влияет ли на это наименование ... Я использовал 0000 в имени файла, и оно появилось первым.
По умолчанию он будет сортировать его как строку, но вы, конечно, можете это изменить... (потому что имена файлов являются строками)
@zyonneo по умолчанию GetFiles
сортирует по имени файла => начиная с 0
идет перед началом с 1
, хотя также говорит MSDN:The order of the returned file names is not guaranteed; use the Sort() method if a specific sort order is required.
и т. д. В данной ссылке вы можете видеть, что вместо этого они сортируются (как вы хотите) по files.OrderBy(f => f.CreationTime);
Я сохраняю их в папке. На самом деле я создаю префаб. Так что это должен быть префаб, который я должен сортировать, а не файлы, верно?
но вы повторяете файлы и добавляете префаб для каждого файла ... поэтому вы должны отсортировать info
, чтобы создать префабы в правильном порядке. Афаик SetParent
всегда добавляет дочерний элемент последним ... просто чтобы убедиться, что вы также можете заглянуть в Transform.SetAsLastSibling
Я бы, кстати, вместо того, чтобы снова повторять кнопки, уже установил их непосредственно при создании экземпляра сборного...
@derHugo Да, я думаю, это то, что я пытался решить ..
varorderedFiles = info.OrderBy(f => f.CreationTime); Теперь orderFiles содержит информацию по порядку, верно? Но я не могу ничего получить из упорядоченных файлов. mapnamedb.text =информация[i-1].Имя; вместо этого я использовал mapnamedb.text =orderedFiles[i-1].Name; показывает ошибку.
@zyonneo «orderfiles» сверху содержит ВСЮ информацию о файле, с которой вы начали, поэтому вы должны иметь возможность получить всю информацию, которую хотели.
@BugFinder Не получается, хотя появляется ошибка. Ошибка CS0021: невозможно применить индексирование с помощью [] к выражению типа «IOrderedEnumerable<FileSystemInfo>»...
использовать var orderedFiles = info.OrderBy(f => f.CreationTime).ToList();
Пробовал простое исправление... if (i==infos.Length) { int aa = Parentcontent.childCount; Parentcontent.GetChild(0).SetSiblingIndex(aa - 1); } . При загрузке списка несколько номеров индексов с одинаковыми именами файлов предыдущего созданного файла
Я установил все это вместе, и теперь это отлично работает для меня:
Примечание. Я закомментировал все, что не относится к примеру (или то, что вы не добавили в свой код в вопросе)
public class FilesExample : MonoBehaviour
{
// Start is called before the first frame update
private void Start()
{
ListMap();
}
public static FileSystemInfo[] info;
public void ListMap()
{
/*
* If you already called this before you already have child objects
* So I would destroy the old ones before instantiating new ones
*/
//foreach(Transform child in Parentcontent)
foreach(Transform child in transform)
{
Destroy(child.gameObject);
}
//panellist.SetActive(true);
/*
* preferred to use streamingAssetsPath for testing
*/
//var mainpath = Application.persistentDataPath;
var mainpath = Application.streamingAssetsPath;
var dir = new DirectoryInfo(mainpath);
info = dir.GetFileSystemInfos("*.json").OrderBy(i => i.CreationTime).ToArray();
for (var i = 1; i <= info.Length; i++)
{
/*
* Instead of instantiating I simply created new empty objects
* just as example
*/
//var lisobj = Instantiate(prefabpanellist);
var lisobj = new GameObject(i + " " + info[i - 1].Name);
//lisobj.transform.SetParent(Parentcontent);
lisobj.transform.SetParent(transform);
// Though I'm sure this should already have the correct order
// you could still do SetLastSibling to move the
// created/instantiated object to the bottom
lisobj.transform.SetAsLastSibling();
//number.text = i.ToString();
//mapnamedb.text = info[i - 1].Name;
/*
* NOTE: I would simply do the buttons thing in the same
* loop. That saves you a lot of storing and accessing lists
*/
//var index = i;
//var button = lisobj.GetComponentInChildren<Button>(true);
//button.onClick.AddListener(() => Deleteinformation(index));
}
}
public void Deleteinformation(int index)
{
Debug.Log("Index is " + index);
Debug.Log("Path is " + info[index].FullName);
File.Delete( info[index].FullName);
// update the scene list
ListMap();
}
}
Результат
Файлы на диске упорядочены по имени
Файлы на диске упорядочены по дате создания
результат в Unity, упорядоченный по дате создания
Я могу создавать экземпляры и делать то же самое правильно. Я могу создавать экземпляры, чтобы отображать их в виде списка с текстом и кнопкой удаления.
Instatiate создает проблему. Он будет добавлен только вверху. Поэтому я использовал этот код, чтобы вывести его из последнего созданного значения списка с помощью кнопки удаления........ if (i == infos.Length) { int aa = Parentcontent.childCount; Parentcontent.GetChild(0).SetSiblingIndex(aa - 1); } ........... но когда я удаляю последний элемент, первый элемент в списке удаляется
@derHugo..Как обновить список файлов при удалении файла.
вы могли бы перед созданием экземпляра уничтожить всех текущих детей (foreach(Transform child in transform){ Destroy(child.gameObject); }
)
Информация @DerHugo..FileSystemInfo [] сохранить их в кеш?. Я дважды нажал «Воспроизвести», чтобы обновить свой список содержимым из папки. Не обновляется, когда я добавляю вызов функции ListMap() внутри Deletemap...... ..............if (Parentcontent.childCount>0) { GameObject gg = Parentcontent.GetChild(i-1).gameObject; Уничтожить (гг); Debug.Log("Имя = " + gg.name); }
возможно ли, что File.Delete
занимает некоторое время, и поэтому ListMap просто вызывается раньше?
Не время, я считаю .... Подожду некоторое время и проверю ... Также я добавил файл . кнопку «Назад» и позвольте мне снова щелкнуть Listmap. Должен ли я использовать Coroutine?
Возможный дубликат Сортировка Directory.GetFiles()