public FileTransReceiver(string localPath, Stream src)
        {
            m_srcReader = new BinaryReader(src, Encoding.Default);
            m_srcWriter = new BinaryWriter(src, Encoding.Default);
            m_workStart = false;
            m_transState = FileTransState.Continue;

            if (Directory.Exists(localPath))
            {
                m_localDir = localPath;
            }
            else
            {
                m_localDir = Path.GetDirectoryName(localPath);
            }

            if (!m_localDir.EndsWith(Path.DirectorySeparatorChar.ToString())) m_localDir += Path.DirectorySeparatorChar;

            m_transedFileCount = 0;
            m_fileCount = m_srcReader.ReadInt32();
        }
 public void Abort()
 {
     m_transState = FileTransState.Abort;
 }
        public FileTransSender(string localPath, Stream dest)
        {
            m_destReader = new BinaryReader(dest, Encoding.Default);
            m_destWriter = new BinaryWriter(dest, Encoding.Default);
            m_workStart = false;
            m_transState = FileTransState.Continue;

            if (Directory.Exists(localPath))
            {
                string[] files = Directory.GetFiles(localPath, "*", SearchOption.AllDirectories);
                if (files == null || files.Length == 0) throw new IOException("文件夹为空!");
                m_untransedFiles.InsertRange(0, files);

                m_localDir = localPath;
            }
            else
            {
                if (!File.Exists(localPath)) throw new IOException("文件不存在!");

                m_untransedFiles.Insert(0, localPath);

                m_localDir = Path.GetDirectoryName(localPath);
            }

            if (!m_localDir.EndsWith(Path.DirectorySeparatorChar.ToString())) m_localDir += Path.DirectorySeparatorChar;

            // 通知有多少个文件
            Program.Assert(FileCount > 0);
            m_destWriter.Write(FileCount);
            m_destWriter.Flush();
        }
        private void WorkImpl_Async(object state)
        {
            try
            {
                while (m_untransedFiles.Count > 0)
                {
                    // 测试是否应该结束发送文件
                    {
                        m_destWriter.Write((int)m_transState);
                        m_destWriter.Flush();
                        int readInt = m_destReader.ReadInt32();
                        if (m_transState == FileTransState.Continue)
                        {
                            m_transState = (FileTransState)readInt;
                        }
                        if (m_transState == FileTransState.Abort)
                        {
                            if (Aborted != null) Aborted();
                            break;
                        }
                    }

                    string file = m_untransedFiles[m_untransedFiles.Count - 1];
                    m_untransedFiles.RemoveAt(m_untransedFiles.Count - 1);
                    if (m_transedFiles.Count > 0) m_transedFiles.Insert(m_transedFiles.Count - 1, file);
                    else m_transedFiles.Insert(0, file);

                    string relatFileName = file.Substring(m_localDir.Length);
                    int fileSize = 0;
                    BinaryReader reader = null;

                    try
                    {
                        fileSize = (int)new FileInfo(file).Length;
                        if (fileSize > 0)
                        reader = new BinaryReader(new BufferedStream(File.Open(file, FileMode.Open, FileAccess.Read), 1 << 22));
                    }
                    catch {  }
                    if (reader == null) fileSize = 0;

                    // 写入文件大小、文件名长度、文件名
                    m_destWriter.Write(fileSize);
                    m_destWriter.Write(relatFileName);

                    if (FileTransing != null) FileTransing(relatFileName);

                    if (fileSize > 0)
                    {
                        Program.Assert(reader != null);
                        byte[] buf = new byte[1024];
                        for (; ; )
                        {
                            int readedBytes = reader.Read(buf, 0, buf.Length);
                            if (readedBytes == 0) break;
                            m_destWriter.Write(buf, 0, readedBytes);

                            m_transedBytes += readedBytes;
                        }
                    }
                    m_destWriter.Flush();

                    if (reader != null) reader.Close();
                }
            }
            catch(Exception e)
            {
                if (TransCompleted != null) TransCompleted("未知的错误 : " + e);
                return;
            }

            if (TransCompleted != null) TransCompleted(null);
        }
        private void WorkImpl_Async(object state)
        {
            try
            {
                while (m_transedFileCount < m_fileCount)
                {
                    // 测试是否应该结束发送文件
                    {
                        int readInt = m_srcReader.ReadInt32();
                        if (m_transState == FileTransState.Continue)
                        {
                            m_transState = (FileTransState)readInt;
                        }
                        m_srcWriter.Write((int)m_transState);
                        m_srcWriter.Flush();
                        if (m_transState == FileTransState.Abort)
                        {
                            if (Aborted != null) Aborted();
                            break;
                        }
                    }

                    ++m_transedFileCount;

                    string relatFileName = null;
                    int fileSize = 0;
                    BinaryWriter writer = null;

                    {
                        fileSize = m_srcReader.ReadInt32();
                        relatFileName = m_srcReader.ReadString();

                        while (File.Exists(m_localDir + relatFileName)) relatFileName = "_" + relatFileName;
                        {
                            string dirName = Path.GetDirectoryName(m_localDir + relatFileName);
                            if (!Directory.Exists(dirName)) Directory.CreateDirectory(dirName);
                        }
                        writer = new BinaryWriter(new BufferedStream(
                            File.Open(m_localDir + relatFileName, FileMode.Create, FileAccess.Write), 1 << 22));
                    }

                    if (FileTransing != null) FileTransing(relatFileName);

                    if (fileSize > 0)
                    {
                        byte[] buf = new byte[1024];

                        int leftFileSize = fileSize;
                        while (leftFileSize > 0)
                        {
                            int readedBytes = m_srcReader.Read(buf, 0, Math.Min(buf.Length, leftFileSize));
                            if (writer != null) writer.Write(buf, 0, readedBytes);

                            m_transedBytes += readedBytes;
                            leftFileSize -= readedBytes;
                        }
                    }

                    if (writer != null) writer.Close();
                }
            }
            catch (Exception e)
            {
                if (TransCompleted != null) TransCompleted("未知的错误 :\n" + e);
                return;
            }

            if (TransCompleted != null) TransCompleted(null);
        }