/// <summary> /// 执行打开文件 /// </summary> /// <param name="fileName"></param> private void _DoOpenFile(string fileName) { try { hexBox.stream = null; DynamicFileByteProvider dynamicFileByteProvider; try { Encoding _encoding = this.hexBox._encoding; if (this.hexBox.IsUseBase64) { this.hexBox.IsUseEncoding = true; // 读成自己的解码后的流 try { FileStream inputStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); byte[] data = new byte[4 * 1024]; //Chunk size is 4k inputStream.Seek(0, SeekOrigin.Begin); int read = inputStream.Read(data, 0, data.Length); byte[] chunk = new byte[4 * 1024]; List <byte> list = new List <byte>(); while (read > 0) { chunk = Convert.FromBase64String(_encoding.GetString(data, 0, read)); list.AddRange(chunk); read = inputStream.Read(data, 0, data.Length); } var decodeBytes = list.ToArray(); // 放入流中 Stream stream = new MemoryStream(decodeBytes); inputStream.Close(); //dynamicFileByteProvider = new DynamicFileByteProvider(fileName); dynamicFileByteProvider = new DynamicFileByteProvider(stream, _encoding); } catch (Exception ex) { var tmp = @"Base64编码无效"; this.hexBox._encoding = Encoding.UTF8; byte[] bytes = this.hexBox._encoding.GetBytes(tmp); Stream stream = new MemoryStream(bytes); // try to open in read-only mode dynamicFileByteProvider = new DynamicFileByteProvider(stream); this.hexBox.IsUseBase64 = false; } } else { if (!System.Utility.Helper.File.IsValid(fileName)) { byte[] data = new byte[0]; Stream stream = new MemoryStream(data); dynamicFileByteProvider = new DynamicFileByteProvider(stream); hexBox.ByteProvider = dynamicFileByteProvider; _fileName = fileName; this.fileSizeToolStripStatusLabel.Text = Util.GetDisplayBytes(this.hexBox.ByteProvider.Length); return; } // try to open in write mode dynamicFileByteProvider = new DynamicFileByteProvider(fileName, true, this.IsGoToGetDefaultCharset); } } catch (IOException) // write mode failed { try { if (!System.Utility.Helper.File.IsValid(fileName)) { return; } // try to open in read-only mode dynamicFileByteProvider = new DynamicFileByteProvider(fileName, true); } catch (IOException) // read-only also failed { // file cannot be opened return; } } if (!System.Utility.Helper.File.IsValid(fileName)) { return; } if (this.IsGoToGetDefaultCharset) { hexBox._encoding = dynamicFileByteProvider.GetEncoding(); IsGoToGetDefaultCharset = false; } hexBox.ByteProvider = dynamicFileByteProvider; _fileName = fileName; this.fileSizeToolStripStatusLabel.Text = Util.GetDisplayBytes(this.hexBox.ByteProvider.Length); } catch { byte[] data = new byte[0]; Stream stream = new MemoryStream(data); var dynamicFileByteProvider = new DynamicFileByteProvider(stream); hexBox.ByteProvider = dynamicFileByteProvider; _fileName = fileName; this.fileSizeToolStripStatusLabel.Text = Util.GetDisplayBytes(this.hexBox.ByteProvider.Length); return; } }
/// <summary> /// 使用流打开文件 /// </summary> /// <param name="stream">文件流</param> private void _DoOpenFile(Stream stream) { hexBox.fileName = null; DynamicFileByteProvider dynamicFileByteProvider; try { var bugFix = stream.ReadByte(); stream.Position = 0; this.hexBox.stream = stream; try { try { Encoding _encoding = this.hexBox._encoding; if (this.hexBox.IsUseBase64 && stream.Length < 1024 * 1024 * 10) { this.hexBox.IsUseEncoding = true; // 读成自己的解码后的流 try { byte[] data = new byte[4 * 1024]; //Chunk size is 4k stream.Seek(0, SeekOrigin.Begin); int read = stream.Read(data, 0, data.Length); byte[] chunk = new byte[4 * 1024]; List <byte> list = new List <byte>(); while (read > 0) { chunk = Convert.FromBase64String(_encoding.GetString(data, 0, read)); list.AddRange(chunk); read = stream.Read(data, 0, data.Length); } var decodeBytes = list.ToArray(); // 放入流中 Stream ms = new MemoryStream(decodeBytes); stream.Close(); //dynamicFileByteProvider = new DynamicFileByteProvider(fileName); dynamicFileByteProvider = new DynamicFileByteProvider(ms, _encoding); } catch (Exception ex) { var tmp = @"Base64编码无效"; this.hexBox._encoding = Encoding.UTF8; byte[] bytes = this.hexBox._encoding.GetBytes(tmp); Stream tmp_stream = new MemoryStream(bytes); // try to open in read-only mode dynamicFileByteProvider = new DynamicFileByteProvider(tmp_stream); this.hexBox.IsUseBase64 = false; } } else { // try to open in write mode dynamicFileByteProvider = new DynamicFileByteProvider(stream); } } catch (IOException) // write mode failed { try { // try to open in read-only mode dynamicFileByteProvider = new DynamicFileByteProvider(stream); } catch (IOException) // read-only also failed { // file cannot be opened return; } } if (this.IsGoToGetDefaultCharset) { hexBox._encoding = dynamicFileByteProvider.GetEncoding(); IsGoToGetDefaultCharset = false; } hexBox.ByteProvider = dynamicFileByteProvider; this.fileSizeToolStripStatusLabel.Text = Util.GetDisplayBytes(this.hexBox.ByteProvider.Length); } catch { } } catch (Exception ex) { byte[] data = new byte[0]; Stream stream1 = new MemoryStream(data); dynamicFileByteProvider = new DynamicFileByteProvider(stream1); hexBox.ByteProvider = dynamicFileByteProvider; this.fileSizeToolStripStatusLabel.Text = Util.GetDisplayBytes(this.hexBox.ByteProvider.Length); } }