Caractères illégaux dans le chemin d'accès lors de l'utilisation de StreamReader
J'ai de la difficulté avec l'ouverture d'un StreamReader
objet en C#. Je reçois toujours l'exception Illegal characters in path
. La seule façon que je peux l'obtenir pour fonctionner est de savoir si j'utilise la totalité du nom du chemin d'accès à l'aide de la @
symbole pour ne pas échapper à toute \
caractères dans le chemin d'accès au fichier. Cependant, ce n'est pas vraiment m'aider parce que je commence avec les deux variables distinctes pour le chemin d'accès du fichier et le nom du fichier de sortie à partir d'une autre méthode (qui ne peut pas être changé).
J'ai traversé huit permutations qui ont tous échoué, qui sont commentées ci-dessous pour référence. Par souci de lisibilité, ici, de faire semblant que je suis déclarant dirIni
et fileIni
au lieu de recevoir leurs valeurs de sortie à partir d'une autre méthode. Avec qui a déclaré, à la fois de la déclaration de style 1 et 2 a échoué à l'aide de tous les quatre concaténation des méthodes. Ce qui se passe ici? J'ai à peu près vu tous les quatre concaténation des méthodes de travail dans d'autres exemples.
EDIT:
J'ai simplifié le code pour afficher 1 version de ce qui rompt pour moi:
string dirIni = @"C:\Users\Dan\AppData\Local\MyApp 4.0\INI\";
string fileIni = @"PWTRANSACTION.INI";
try
{
string transIniFullFileName = Path.Combine(dirIni, fileIni);
using (StreamReader file = new StreamReader(transIniFullFileName))
{
//do StreamReader stuff...
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Est ici l'exception de la trace de la pile:
at System.IO.Path.CheckInvalidPathChars(String path)
at System.IO.Path.GetFileName(String path)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
at System.IO.StreamReader..ctor(String path)
at TestApp.Form1.btnTestRead_Click(Object sender, EventArgs e) in C:\Users\Dan\TestApp\Form1.cs:line 4977
Vous avez dit (paraphrase) "faire semblant je ne reçois pas les valeurs à partir d'une autre méthode". Cela pourrait être très important...avez-vous vraiment essayé de faire de la manière que vous avez indiqué ici? Êtes-vous sûr à 100% que les chemins d'accès à partir d'autres méthodes n'ont pas de caractères illégaux?
Le sans échappement dit "traiter tous les éléments suivants comme littéralement" si c'est comme backslashing TOUT ce qu'il faut pour.. il aurais pas besoin de faire de l'espace, mais il y a clairement une différence entre l'ensemble échappé à l'un et pas.
J'ai copié le code, et il a couru avec
string transIniFullFileName = "C:\\Users\\Dan\\AppData\\Local\\MyApp 4.0\\INI\\PWTRANSACTION.INI";
décommenté et avec le @
version commentée. J'ai seulement touché un DirectoryNotFoundException
. Y aurait-il des caractères magique dans votre version locale que nous ne voyons pas?l'un des buts d'une Simple Auto-Contenue Exemple Correcte(SSCCE) pour d'autres personnes à être en mesure de copier et de la coller dans leur instance de visual studio et de voir comment il fonctionne pour eux. C'est pourquoi, comme avant, j'ai suggéré de le faire dans un NOUVEAU PROJET, et ensuite, ASSUREZ-vous QU'IL ne parvient TOUJOURS pas de LA MÊME FAÇON.
OriginalL'auteur DanM7 | 2012-09-26
Vous devez vous connecter pour publier un commentaire.
La question était la méthode retourne une chaîne qui avait un caractère Séparateur de Champ à la fin, et qui a du caractère illégal. J'ai été également à l'aide de ces chaînes dans mon code de test. J'ai collé mon code dans notepad++ et c'est ce qu'il m'a montré:
Séparateurs de champ http://dbwire.com/img/Answer.jpg
Après la suppression de la FS, tout a fonctionné correctement. Merci à vous tous pour m'aider à tester le code, en particulier par @Dynguss.
Tout le temps VS donne du Caractère Illégal d'exception, vérifier la présence éventuelle de personnages cachés!
OriginalL'auteur DanM7
La suivante devrait fonctionner:
et pour éviter de coder en dur les Locaux dossier de Données d'Application:
Par la façon dont les deux suivantes de la chaîne de déclarations sont parfaitement identiques:
Donc, si vous dites que la première tentative échoue, mais le second réussit, bien, je pense qu'il y a autre chose qui ne fonctionne pas et vous ne nous montrent pas votre code réel.
Path.Combine
en règle générale lorsque vous traitez avec des chemins d'accès). Je n'ai aucune idée de pourquoi il a obtenu downvoted?Il a obtenu downvoted parce qu'il n'a pas fait de répondre à la question
Je suis d'aborder la question dans la deuxième partie de ma réponse (après la fourniture de ce que je considère l'approche correcte):
So if you are saying that the first fails but the second succeeds, well, I guess there's something else that's failing and you are not showing us your real code.
OriginalL'auteur Darin Dimitrov