예제 #1
0
        private FtpDataStream GetStream(long offset, TransferDirection dir)
        {
            m_parent.CheckSessionCurrentDirectory();

            FtpSessionConnected Session = m_parent.Session;

            if (offset != 0)
            {
                Session.ControlChannel.REST(offset);
            }

            FtpDataStream stream = Session.ControlChannel.GetPassiveDataStream(dir);

            try
            {
                if (dir == TransferDirection.Download)
                {
                    Session.ControlChannel.RETR(m_name);
                }
                else
                {
                    Session.ControlChannel.STOR(m_name);
                }
            }
            catch
            {
                stream.Close();
                throw;
            }

            return(stream);
        }
예제 #2
0
파일: FtpDirectory.cs 프로젝트: ellen50/gsf
        /// <summary>
        /// Creates a new zero-length remote file in directory.
        /// </summary>
        /// <param name="newFileName">New remote file name.</param>
        /// <returns>File reference to new zero-length remote file.</returns>
        public FtpFile CreateFile(string newFileName)
        {
            FtpDataStream stream = CreateFileStream(newFileName);

            stream.Close();

            return(m_files[newFileName]);
        }
예제 #3
0
        internal Queue List(bool passive)
        {
            const string errorMsgListing = "Error when listing server directory.";

            try
            {
                Type(TransferMode.Ascii);
                Queue lineQueue = new Queue();

                using (FtpDataStream dataStream = GetDataStream())
                    using (StreamReader lineReader = new StreamReader(dataStream, Encoding.Default, true, 1024, true))
                    {
                        Command("LIST");

                        if (m_lastResponse.Code != FtpResponse.DataChannelOpenedTransferStart && m_lastResponse.Code != FtpResponse.FileOkBeginOpenDataChannel)
                        {
                            dataStream.Close(true);
                            throw new FtpCommandException(errorMsgListing, m_lastResponse);
                        }

                        string line = lineReader.ReadLine();

                        while ((object)line != null)
                        {
                            lineQueue.Enqueue(line);
                            line = lineReader.ReadLine();
                        }
                    }

                if (m_lastResponse.Code != FtpResponse.ClosingDataChannel)
                {
                    throw new FtpCommandException(errorMsgListing, m_lastResponse);
                }

                return(lineQueue);
            }
            catch (IOException ie)
            {
                throw new Exception(errorMsgListing, ie);
            }
            catch (SocketException se)
            {
                throw new Exception(errorMsgListing, se);
            }
        }
예제 #4
0
파일: FtpDirectory.cs 프로젝트: ellen50/gsf
        /// <summary>
        /// Creates a new data stream for remote file in directory.
        /// </summary>
        /// <param name="newFileName">New remote file name.</param>
        /// <returns>Output data stream for new remote file.</returns>
        public FtpOutputDataStream CreateFileStream(string newFileName)
        {
            InitHashtable();

            FtpDataStream stream = m_session.ControlChannel.GetPassiveDataStream(TransferDirection.Upload);

            try
            {
                m_session.ControlChannel.STOR(newFileName);

                FtpFile newFile = new FtpFile(this, newFileName);

                m_files[newFileName] = newFile;

                return((FtpOutputDataStream)stream);
            }
            catch
            {
                stream.Close();
                throw;
            }
        }