У меня есть приложение C# Windows Phone 7.1, которое загружает файл PDF с внешнего веб-сервера, а затем (пытается) сохранить его в изолированной области хранения как файл. Я пробовал несколько разных способов сделать это, но файл всегда заканчивается примерно на 30% слишком большим, и когда я открываю его в текстовом редакторе, вместо того, чтобы видеть символы USUAL 'PDF' в начале файла, а затем закодированные символы, я вижу в основном барахло. Файл теста, который я использую, должен быть 161k, но когда я просматриваю файл с Isolated Storage Explorer, это 271k.Байт-массив, записанный в отдельный файл области хранения в C# Приложение Windows Phone 7 недействительно
Сначала я загружаю файл в строку. Я проверил строку в этой точке отладчика, и он содержит правильные значения, и это правильная длина. Проблема возникает, когда я пытаюсь записать ее в изолированную область хранения. Я пробовал и StreamWriter & BinaryWriter с идентичными недействительными результатами. Содержимое результирующего файла представляет собой длинный поток нежелательных символов. Обратите внимание: я удаляю файл, если он существует на всякий случай, прежде чем записывать содержимое. Ниже приведен мой код, используя версию BinaryWriter. Что не так?
async public static Task URLToFileAsync(
string strUrl,
string strDestFilename,
IProgress<int> progress,
CancellationToken cancelToken)
{
strUrl = strUrl.Trim();
if (String.IsNullOrWhiteSpace(strUrl))
throw new ArgumentException("(Misc::URLToFileAsync) The URL is empty.");
strDestFilename = strDestFilename.Trim();
if (String.IsNullOrWhiteSpace(strDestFilename))
throw new ArgumentException("(Misc::URLToFileAsync) The destination file name is empty.");
// Create the isolated storage file.
// FileStream fs = Misc.CreateIsolatedStorageFileStream(strDestFilename);
IsolatedStorageFile isoStorage = IsolatedStorageFile.GetUserStoreForApplication();
// Delete the file first.
if (isoStorage.FileExists(strDestFilename))
isoStorage.DeleteFile(strDestFilename);
IsolatedStorageFileStream theIsoStream = isoStorage.OpenFile(strDestFilename, FileMode.Create);
FileStream fs = theIsoStream;
// If the stream writer is NULL, then the file could not be created.
if (fs == null)
throw new System.IO.IOException("(Misc::URLToFileAsync) Error creating or writing to the file named: " + strDestFilename);
BinaryWriter bw = new BinaryWriter(fs);
try
{
// Call URLToStringAsync() to get the web file as a string first.
string strFileContents = await URLToStringAsync(strUrl, progress, cancelToken);
// >>>> NOTE: strFileContents looks correct and is the correct size.
// Operation cancelled?
if (!safeCancellationCheck(cancelToken))
{
// Note. BinaryWriter does not have an Async method so we take the hit here
// to do a synchronous operation.
// See this Stack Overflow post.
// http://stackoverflow.com/questions/10315316/asynchronous-binaryreader-and-binarywriter-in-net
// >>>> NOTE: strFileContents.ToCharArray() looks correct and is the correct length.
bw.Write(strFileContents.ToCharArray(), 0, strFileContents.Length);
} // if (safeCancellationCheck(cancelToken))
}
finally
{
// Make sure the file is cleaned up.
bw.Flush();
bw.Close();
// Make sure the file is disposed.
bw.Dispose();
} // try/finally
// >>>> NOTE: output file in Isolated Storage Explorer is the wrong size and contains apparently junk.
} // async public static void URLToFileAsync
@chue_x. Благодарю. Это сработало, но я хотел бы знать, почему, тем более, что длина строки идентична размеру веб-файла. Единственная причина разницы, которую я могу себе представить, это то, что C# /. NET хранит строки с многобайтовой кодировкой или какой-либо другой кодировкой в самой строковой памяти, что-то, что по крайней мере не .NET C, C++ и Delphi не делает , –
@RobertOschler ** Все строки в .NET кодируются в UTF-16 **. Поэтому при чтении строки среда выполнения попытается преобразовать символы в эту кодировку. Когда не удается выяснить, какая кодировка используется источником, по умолчанию будет использоваться UTF-8. Таким образом, в вашем случае .NET считал, что ваш файл PDF является кодированным UTF-8 текстом и преобразовывает его в UTF-16. Поскольку оба кодирования не имеют одного и того же двоичного представления, это объясняет, почему ваши данные были повреждены. –
@KooKiz - Это объясняет это, спасибо. Я переключил все на байтовые массивы, и теперь все хорошо. –