Do zero: como desenvolver uma ferramenta de pesquisa de arquivos rivalizando com “tudo” usando puro c#

É sabido que a busca de arquivos lendo o diário USN é muito mais eficiente do que a travessia tradicional de pastas recursiva. No entanto, alcançar a velocidade extrema de “tudo” não é simples – mesmo um atraso de apenas algumas dezenas de milissegundos pode fazer um mundo de diferença na experiência do usuário. Hoje, o estilo de interface de “tudo” parece um pouco clássico, e alguns de seus hábitos operacionais são difíceis de personalizar. Presumivelmente, muitos usuários desejam uma ferramenta de pesquisa que seja extremamente eficiente e perfeitamente adaptada aos seus hábitos de uso pessoal: como teclas de atalho mais flexíveis, mais ricos clique com o botão direito do mouse e vínculos subsequentes de operação. Precisamente por esse motivo, decidi reconstruir essa ferramenta e documentar o processo de pensamento e as “armadilhas” encontradas durante todo o desenvolvimento. O código e a implementação final são de código aberto completamente. 1. Abordagem geral O projeto inteiro pode ser dividido em duas partes principais: processamento de dados e interação da interface do usuário. Fluxo de processamento de dados: a. Leia as informações do arquivo do cache do disco b. Carregue os dados na memória c. Execute a correspondência de string d. Retorne resultados correspondentes Fluxo de interação da interface do usuário: a. Responda à entrada do usuário b. Acionar pesquisa e obtenha resultados c. Atualize a exibição da interface 2. Melhorando a eficiência do processamento de dados a. Lendo as informações do arquivo do cache do disco, obtemos informações de arquivo lendo o diário USN. Cada registro deve conter pelo menos: o número de referência do arquivo (fileReferenceNumber, Ulong), o número de referência do arquivo pai (ParentFileReferenceNumber, Ulong) e o nome do arquivo (incluindo nomes de pastas). Nota: o USN não fornece diretamente o caminho completo; Precisamos juntar o caminho real passo a passo com base nas referências dos pais. Outro aspecto importante são as atualizações incrementais. O USN pode gravar alterações no estado do arquivo (como criação, exclusão, renomeação). Monitorando eventos como USN_Reason_File_Create | USN_REASASE_FILE_DELETE | USN_REASASE_RENAME_NEW_NAME, atualizações de dados eficientes podem ser alcançadas, muito superiores aos métodos tradicionais de monitoramento de arquivos. b. Estratégia de pesquisa na memória O método de pesquisa mais básico é atravessar todas as cordas, mas esse desempenho está longe de ser suficiente. Tentei os seguintes métodos: Construindo um mecanismo de índice: usando uma estrutura semelhante a um filtro de flores com o tipo Ulong para filtragem preliminar. As operações preliminares por meio de operações pré-computadas “ou” mostraram uma melhoria de velocidade de pesquisa de 2 a 3x medida nos testes. public static ulong tbs (string txt) {ulong indexValue = 0; for (int i = 0; i : ReactiveObject {private Ilist _alldata = []; privado ienumerable _displayedData = []; private int _displayCount = 100; Público Ienumerable DisplayEdData {get => _displayedData; Set privado => this.raiseandSetifChanged (ref _displayedData, valor); } public int DisplayCount {get => _displayCount; set {_displayCount = value; UpdatedIsplayedData (); }} public dataViewModel () {} public void bind (ilist _alldata) {if (this._alldata! = _alldata) {// gera dados de teste (na prática, carregados de arquivo ou db) this._alldata = _alldata; UpdatedIsplayedData (); }} private void updatedIsplayedData () {// Use Linq’s Take (), que é preguiçoso-avaliado e executa bem exibidoDData = _alldata.take (displayCount); } // Mudar rapidamente para uma escala pública de escala diferente SetDisplayCount (int count) {if (displayCount! = Count) {if (contagem < 0) count = 0;
DisplayCount = count;
}
}
}

File paths and icons are obtained dynamically (caching can be appropriately introduced). Icons were initially loaded asynchronously, but this caused flickering. Switching to synchronous acquisition resulted in more stable performance.

public string FileName => PathHelper.getFilePath (nome do arquivo) .ToString (); public string filepath => pathelper.getpath (this) .toString (); Digite o modo de saída de tela cheia 4. 5. Conclusão Se você tiver alguma sugestão ou idéias sobre esta ferramenta, fique à vontade para discutir! O projeto é completamente de código aberto no GitHub. Se você achar útil, seja bem -vindo para dar uma estrela ⭐️!

Fonte

Você pode ter perdido