Est-il possible de créer un gros fichier (physiquement) contigu sur un disque en utilisant C#? De préférence en utilisant uniquement du code managé, mais si ce n'est pas possible, une solution non gérée serait appréciée.Créer un fichier contigu en utilisant C#?
Répondre
Écrire un défragment?
On dirait que vous êtes après l'API Défragmentation de toute façon: -
http://msdn.microsoft.com/en-us/library/aa363911%28v=vs.85%29.aspx
Le lien à partir du bas, parce que ça vous semble avez manqué l'emballage C# que quelqu'un a bien voulu produit.
http://blogs.msdn.com/b/jeffrey_wall/archive/2004/09/13/229137.aspx
Ouais, peut-être. Mais ne faites pas cela en C#. –
Pour être honnête, bien que non géré, cette seule solution présentée jusqu'ici qui pourrait produire un fichier contigu, upvoted. – tmitchel2
Bref pas alors
Le système d'exploitation le fera en arrière-plan, ce que je ferais est de rendre le fichier aussi grand que vous attendez qu'il soit, de cette façon le système d'exploitation le placera contigously. Et si vous avez besoin de développer le fichier, vous le faites croître de 10% à chaque fois. Ceci est similaire à la manière dont un serveur SQL conserve les fichiers de base de données.
Ouvrez l'ouverture du FileStream et ouvrez-la avec l'ajout.
Exemple:
FileStream fwriter = new FileStream("C:\\test.txt", FileMode.Append, FileAccess.Write, FileShare.Read);
Et cela garantira que sur le disque dur, le fichier sera écrit de manière contiguë? Je crois que non. – Oded
sry, votre droite. Réponse mise à jour – EKS
Votre mise à jour n'est toujours pas correcte. Le système d'exploitation n'écrit pas automatiquement les fichiers à des positions physiquement contiguës sur le disque, et ne le fait pas en arrière-plan, sauf si vous lui dites explicitement de défragmenter (et même alors, il n'y a aucune garantie sur l'endroit exact). La contiguïté physique est un obstacle important à la demande du PO. Vous manquez quelques détails sur l'implémentation de SQL Server. –
Tout fichier que vous créez sont logiquement contigus.
Si vous voulez physiquement contigu vous êtes sur le territoire de l'OS et du FS. Vraiment (loin) au-delà du contrôle des API d'E/S normales.
Mais ce qui se rapproche probablement est de réclamer l'espace initial: créer un flux vide et définir la propriété Longueur ou Position à ce dont vous avez besoin.
Avec les systèmes de fichiers modernes, il est difficile d'assurer un fichier contigu sur le disque dur. Logiquement, le fichier est toujours contigu, mais les blocs physiques qui conservent les données varient du système de fichiers au système de fichiers. Le meilleur moyen pour cela serait d'utiliser un ancien système de fichiers (ext2, FAT32, etc.) et de demander simplement un fichier volumineux en utilisant la taille de fichier désirée, puis de vider ce fichier. Des systèmes de fichiers plus récents marqueront probablement une taille de fichier importante, mais n'écriront rien sur le disque dur, mais renverront des zéros sur une future lecture sans réellement les lire.
int fileSize = 1024 * 1024 * 512;
FileStream file = new FileStream("C:\\MyFile", FileMode.Create, FileAccess.Write);
file.Seek(fileSize, SeekOrigin.Begin);
file.Close();
Considérant que la raison pour laquelle le demandeur veut faire en premier lieu est (s) il tente de mettre en œuvre une base de données, en utilisant un système de fichiers plus ne va pas travailler. FAT32 est spécifiquement limité à une taille de fichier maximale de 4 Go. Je crois que ext2 a des limites similaires (quelque part autour de 2 Go ou 4 Go), mais je n'ai aucune expérience avec ce système de fichiers, donc je ne sais pas à coup sûr. Il n'y a pas non plus de garantie que FAT32 va retourner un bloc physiquement continu non plus. –
Vous avez raison à ce sujet. FAT32 est plus susceptible de le faire que Ext4, NTFS de tout autre système de fichiers en cours, et en particulier les systèmes de fichiers journalisés. Bien sûr, il n'y a aucune garantie, mais sans accéder à certains outils au niveau du système de fichiers (comme l'API Défragmentation suggéré par d'autres) c'est la meilleure suggestion que je pourrais faire .. –
Pour construire une base de données, vous devez utiliser les fonctions scatter-recueillir E/S fournies par l'API Windows. C'est un type spécial d'E/S de fichier qui vous permet de "disperser" les données d'un fichier en mémoire ou de "rassembler" des données de la mémoire et de les écrire dans une région contiguë d'un fichier. Alors que les tampons dans lesquels les données sont dispersées ou à partir desquelles elles sont collectées n'ont pas besoin d'être contigus, la région de fichier source ou de destination est toujours contiguë.
Cette fonctionnalité comprend deux fonctions principales, toutes deux fonctionnant de manière asynchrone. Le ReadFileScatter
function lit des données contiguës à partir d'un fichier sur le disque et l'écrit dans un tableau de tampons de mémoire non contigus. Le WriteFileGather
function lit des données non-contiguës à partir des tampons de mémoire et l'écrit dans un fichier contigu sur le disque. Bien sûr, vous aurez également besoin du OVERLAPPED
structure utilisé par ces deux fonctions.C'est exactement ce que SQL Server utilise lorsqu'il lit et écrit dans la base de données et/ou ses fichiers journaux, et en fait cette fonctionnalité a été ajoutée à un service pack antérieur pour NT 4.0 spécifiquement pour l'utilisation de SQL Server.
Bien sûr, ce sont des choses de niveau assez avancé, et à peine pour les faibles de cœur. Étonnamment, vous pouvez réellement trouver les définitions P/Invoke sur pinvoke.net, mais j'ai une méfiance intensément sceptique du site. Puisque vous aurez besoin de passer beaucoup de temps avec la documentation juste pour comprendre comment ces fonctions fonctionnent, vous pourriez aussi bien écrire les déclarations vous-même. Et le faire à partir de C# va créer une foule de problèmes supplémentaires pour vous, de sorte que je ne le recommande même pas. Si ce type de performance E/S est important pour vous, je pense que vous utilisez le mauvais outil pour le travail.
La solution de l'homme pauvre est contig.exe, un défragmenteur à un fichier disponible en téléchargement gratuit here.
- 1. Existe-t-il un bon moyen de créer un tableau non contigu en tant que tableau 1D contigu?
- 2. Comment créer un fichier en utilisant Makefile
- 3. Comment créer un fichier doc 2003 en utilisant C#
- 4. Créer un fichier sous Linux en utilisant C
- 5. Comment puis-je créer un fichier zip en utilisant C#?
- 6. Créer un fichier PDF dans WP7 en utilisant C#
- 7. Créer un service en utilisant C#
- 8. Créer un fichier csv en utilisant javascript
- 9. Créer un bmp d'une chaîne en utilisant un fichier TTF en utilisant C?
- 10. Créer un fichier vide en utilisant python
- 11. Créer un fichier CSV en utilisant java
- 12. Créer un fichier vidéo en utilisant PHP
- 13. Comment créer un lien en utilisant C#?
- 14. Comment créer un fichier UTF8 en C#
- 15. Créer un fichier audio en C# (WP7)
- 16. Créer un fichier dans un fichier Zip en C#
- 17. Tableau Numpy non-contigu en accès partagé
- 18. État contigu (USA) État
- 19. Réallocation d'un tableau 2D contigu
- 20. Powershell - Créer un dossier en utilisant un fichier CSV
- 21. J'essaie de créer un lexique en utilisant un fichier d'entrée en C++
- 22. décompresser un fichier en utilisant C#
- 23. Comment restaurer un fichier en utilisant C#?
- 24. Comment puis-je créer un fichier kgring en utilisant python?
- 25. Comment créer un dossier chronologique en utilisant C#?
- 26. comment créer un fichier dans le lecteur C en utilisant C# dans Windows7 OS
- 27. Comment créer un script d'insertion en utilisant C#
- 28. créer un fichier xml en Java en utilisant jaxb
- 29. Créer un fichier en Javascript en utilisant le Bytestream disponible
- 30. Créer un téléchargement CSV en utilisant silverlight 4 et C#
Pourquoi exactement vous sentez-vous que vous avez besoin d'un fichier * contigu physiquement *? Quel problème essayez-vous de résoudre? –
Je construis une sorte de base de données nosql et les performances du disque io sont une priorité. Les solutions de base de données telles que mysql, sqlserver utilisent toujours des fichiers contigus pour améliorer les performances. – tmitchel2