如何从FTP下载时刷新内存流

时间:2014-04-19 17:56:05

标签: c# ftp webrequest

我有从ftp服务器下载文件(zip文件)的代码。但是当我更改zip文件中的文件时,它是从内存下载的。告诉我的意思是当我下载有文件1,文件2,文件3的zip文件时。下次我用文件1,文件2,文件3(文件中的新数据)更改zip文件并将其上传到ftp 。当我使用WS_FTP Pro直接从FTP下载时,我可以看到新文件。但是当我使用我的代码下载zip文件时,我从内存中获取该文件。如何刷新内存流,以便在下载新的zip文件时,我会在zip文件中获取新文件。

代码是。

public static bool downloadFromWeb(string URL, string file, string targetFolder)
    {
        try
        {
            byte[] downloadedData;
            downloadedData = new byte[0];

            //open a data stream from the supplied URL
            WebRequest webReq = WebRequest.Create(URL + file);
            WebResponse webResponse = webReq.GetResponse();
            Stream dataStream = webResponse.GetResponseStream();

            //Download the data in chuncks
            byte[] dataBuffer = new byte[1024];

            //Get the total size of the download
            int dataLength = (int)webResponse.ContentLength;

            //lets declare our downloaded bytes event args
            ByteArgs byteArgs = new ByteArgs();

            byteArgs.downloaded = 0;
            byteArgs.total = dataLength;

            //we need to test for a null as if an event is not consumed we will get an exception
            if (bytesDownloaded != null) bytesDownloaded(byteArgs);


            //Download the data
            MemoryStream memoryStream = new MemoryStream();
            memoryStream.SetLength(0);
            while (true)
            {
                //Let's try and read the data
                int bytesFromStream = dataStream.Read(dataBuffer, 0, dataBuffer.Length);

                if (bytesFromStream == 0)
                {

                    byteArgs.downloaded = dataLength;
                    byteArgs.total = dataLength;
                    if (bytesDownloaded != null) bytesDownloaded(byteArgs);

                    //Download complete
                    break;
                }
                else
                {
                    //Write the downloaded data
                    memoryStream.Write(dataBuffer, 0, bytesFromStream);

                    byteArgs.downloaded = bytesFromStream;
                    byteArgs.total = dataLength;
                    if (bytesDownloaded != null) bytesDownloaded(byteArgs);
                }
            }

            //Convert the downloaded stream to a byte array
            downloadedData = memoryStream.ToArray();

            //Release resources
            dataStream.Close();
            memoryStream.Close();

            //Write bytes to the specified file
            FileStream newFile = new FileStream(targetFolder + file, FileMode.Create);
            newFile.Write(downloadedData, 0, downloadedData.Length);
            newFile.Close();
            return true;
        }
        catch (Exception)
        {
            //We may not be connected to the internet
            //Or the URL may be incorrect
            return false;
        }
    }

请指出我应该从哪里更改以从FTP下载新的zip文件。


我在之前的代码中添加了几行代码。它告诉浏览器不要缓存。这是我的代码,包含更改。

    public static bool downloadFromWeb(string URL, string file, string targetFolder)
    {
        try
        {
            byte[] downloadedData;
            downloadedData = new byte[0];

            // Set a default policy level for the "http:" and "https" schemes.
            HttpRequestCachePolicy policy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default);
            HttpWebRequest.DefaultCachePolicy = policy;

            //open a data stream from the supplied URL
            WebRequest webReq = WebRequest.Create(URL + file);

            // Define a cache policy for this request only. 
            HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
            webReq.CachePolicy = noCachePolicy;

            WebResponse webResponse = webReq.GetResponse();
            Stream dataStream = webResponse.GetResponseStream();

            //Download the data in chuncks
            byte[] dataBuffer = new byte[1024];

            //Get the total size of the download
            int dataLength = (int)webResponse.ContentLength;

            //lets declare our downloaded bytes event args
            ByteArgs byteArgs = new ByteArgs();

            byteArgs.downloaded = 0;
            byteArgs.total = dataLength;

            //we need to test for a null as if an event is not consumed we will get an exception
            if (bytesDownloaded != null) bytesDownloaded(byteArgs);


            //Download the data
            MemoryStream memoryStream = new MemoryStream();
            memoryStream.SetLength(0);
            while (true)
            {
                //Let's try and read the data
                int bytesFromStream = dataStream.Read(dataBuffer, 0, dataBuffer.Length);

                if (bytesFromStream == 0)
                {

                    byteArgs.downloaded = dataLength;
                    byteArgs.total = dataLength;
                    if (bytesDownloaded != null) bytesDownloaded(byteArgs);

                    //Download complete
                    break;
                }
                else
                {
                    //Write the downloaded data
                    memoryStream.Write(dataBuffer, 0, bytesFromStream);

                    byteArgs.downloaded = bytesFromStream;
                    byteArgs.total = dataLength;
                    if (bytesDownloaded != null) bytesDownloaded(byteArgs);
                }
            }

            //Convert the downloaded stream to a byte array
            downloadedData = memoryStream.ToArray();

            //Release resources
            dataStream.Close();

            memoryStream.Close();

            //Write bytes to the specified file
            FileStream newFile = new FileStream(targetFolder + file, FileMode.Create);
            newFile.Write(downloadedData, 0, downloadedData.Length);
            newFile.Close();
            return true;
        }
        catch (Exception)
        {
            //We may not be connected to the internet
            //Or the URL may be incorrect
            return false;
        }
    }

1 个答案:

答案 0 :(得分:1)

我相信您的get-request正在被WebRequest缓存。尝试添加随机查询参数,看看它是否有帮助。

WebRequest webReq = WebRequest.Create(URL + file + "?nocache=" + DateTime.Now.Ticks.ToString());