Ejemplo n.º 1
0
        public int FileUpload(string updateType, DataTable dt, byte[] filedata, int filedatalength, long fileLenth, long fileIdx, int key)
        {
            UpdateDirectory_Chk();

            //UpdateType폴더 경로
            string fldU = UpdateTypeDirectoryPath(updateType);
            //임시폴더 경로
            string fldT = UpdateTypeTempDirectoryPath(updateType);
            //히스토리경로
            string fldH = UpdateTypeHistoryDirectoryPath(updateType);

            string crc;

            FileInfo fi;
            FileInfo fileT;

            DataRow[] rows;

            UpdateTypeKey uKey = new UpdateTypeKey(updateType);
            DateTime      dtFile;
            FileStream    fs;



            if (fileIdx == 0)
            {
                if (dicUploadStream.ContainsKey(uKey))
                {
                    //기존 스트림 정리
                    foreach (UpdateTypeKey k in dicUploadStream.Keys)
                    {
                        if (k.Equals(uKey))
                        {
                            fs = dicUploadStream[k];
                            if (k.StreamStatus == enStreamStatus.Opened)
                            {
                                fnc.FileStream_Close(ref fs);
                            }
                            k.StreamStatus = enStreamStatus.Closed;
                            uKey           = k;
                        }
                    }
                }
                else
                {
                    dicUploadStream.Add(uKey, null);
                }

                uKey.ds = UpdateType_GetDataSet(updateType);


                //신규/기존 데이터 처리
                uKey.row = uKey.ds.Tables[0].NewRow();

                uKey.row.ItemArray = dt.Rows[0].ItemArray;

                rows = uKey.ds.Tables[0].Select(string.Format("UpdateType = '{0}' and FileName = '{1}'", updateType, uKey.row["FileName"]));

                if (rows.Length > 0)
                {
                    uKey.row           = rows[0];
                    uKey.row.ItemArray = dt.Rows[0].ItemArray;
                }
                else
                {
                    uKey.ds.Tables[0].Rows.Add(uKey.row);
                }


                if (uKey.row["ZipFilePath"].ToString() == string.Empty)
                {
                    uKey.file  = fldU + "\\" + uKey.row["filename"].ToString();
                    uKey.fileT = fldT + "\\" + uKey.row["filename"].ToString();
                }
                else
                {                   //압축파일로 올라옴
                    uKey.file  = fldU + "\\" + uKey.row["ZipFilePath"].ToString();
                    uKey.fileT = fldT + "\\" + uKey.row["ZipFilePath"].ToString();
                }

                uKey.fileT = fnc.TempFile_init(uKey.fileT);

                uKey.Key_GetNew();
                key = uKey.Key;

                fileT = new FileInfo(uKey.fileT);

                //임시 폴더 파일 삭제
                if (fileT.Exists)
                {
                    fileT.Delete();
                }

                if (!Directory.Exists(fileT.DirectoryName))
                {
                    Directory.CreateDirectory(fileT.DirectoryName);
                }

                dicUploadStream[uKey] = new FileStream(uKey.fileT, FileMode.Create, FileAccess.Write, FileShare.Delete);
            }
            else
            {
                foreach (UpdateTypeKey k in dicUploadStream.Keys)
                {
                    if (k.Equals(uKey))
                    {
                        uKey = k;
                    }
                }

                if (uKey.Key != key)
                {
                    throw new Exception("WEB FileUpload 오류 - Key 값 불일치");
                }
            }

            fs = dicUploadStream[uKey];

            //file stream write
            fs.Write(filedata, 0, filedatalength);

            uKey.StreamStatus = enStreamStatus.Opened;



            //파일 업로드 종료
            if ((fileIdx + filedata.Length) >= fileLenth)
            {
                //스트립종료
                if (uKey.StreamStatus == enStreamStatus.Opened)
                {
                    fnc.FileStream_Close(ref fs);
                }
                uKey.StreamStatus = enStreamStatus.Closed;


                fi = new FileInfo(uKey.fileT);

                //crc 확인
                crc = fnc.Get_Crc32(uKey.fileT);

                if (!crc.Equals(uKey.row["crc"].ToString()))
                {
                    try
                    {
                        fi.Delete();
                    }
                    catch { }
                    finally
                    {
                        throw new Exception("CRC 불일치");
                    }
                }

                dtFile = (DateTime)uKey.row["File_fileDate"];


                //update 폴더로 파일 이동
                if (File.Exists(uKey.file))
                {
                    File.Delete(uKey.file);
                }

                fileT = new FileInfo(uKey.file);

                if (!Directory.Exists(fileT.DirectoryName))
                {
                    Directory.CreateDirectory(fileT.DirectoryName);
                }

                fi.CopyTo(uKey.file);

                fi = new FileInfo(uKey.file);

                string[] hflds = uKey.row["filename"].ToString().Split('\\');
                fldH += "\\";

                for (int hi = 0; hi < hflds.Length - 1; hi++)
                {
                    //if (hfile != string.Empty) hfile += "\\";
                    fldH += hflds[hi] + "\\";
                }


                //history 폴더의 파일폴더 확인
                if (!Directory.Exists(fldH))
                {
                    Directory.CreateDirectory(fldH);
                }

                //history 생성
                uKey.fileH = string.Format("{0}{1}_{2}_{3}.{4}", fldH, fi.Name, dtFile.ToString("yyyyMMddHHmmss"), uKey.row["file_version"], fi.Extension);
                if (File.Exists(uKey.fileH))
                {
                    File.Delete(uKey.fileH);
                }
                fi.CopyTo(uKey.fileH);


                uKey.row["FileDate"] = uKey.row["File_fileDate"];
                uKey.row["Version"]  = uKey.row["File_Version"];



                //dataset 저장
                uKey.ds.WriteXml(UpdateTypeXmlfilePath(updateType), XmlWriteMode.WriteSchema);
            }


            return(key);
        }
Ejemplo n.º 2
0
 public bool Equals(UpdateTypeKey obj)
 {
     return(UpdateType == obj.UpdateType);
 }