Zip

Tags: , | Categories: C# Posted by talgiladi on 4/15/2008 9:16 PM | Comments (2)

כיווץ בפורמט zip ניתן לביצוע בפשטות בדוט נט עם המחלקות היעודיות לכך.
קודם יש להוסיף את השורה using System.IO.Compression
וכעת ניתן להשתמש במחלקה שנקראת GZipStream

הבנאי מקבל 2 פרמטרים - את הזרם שממנו/אליו צריך לקרוא/לכתוב, ואת צורת הפעולה - לכווץ או לפתוח את המידע

קודם נבחר איזה קובץ אנחנו רוצים לקבץ:

FileStream source = new FileStream(Server.MapPath("myfile.txt"), FileMode.Create);

את הקובץ שאליו נשמור את המידע המכווץ:

FileStream target = new FileStream(Server.MapPath("myzip.zip"), FileMode.Create);

נבנה את האובייקט ונבחר באופצית הכיווץ:

GZipStream zip = new GZipStream(target , CompressionMode.Compress);

וכעת נעביר את הבתים מקובץ המקור לקובץ המטרה:

int bytesCount;
byte[] buffer=new byte [1024];
while((bytesCount = source .Read(buffer, 0, buffer.Length)) != 0)
{
    zip.Write(buffer, 0, bytesCount);
}
target.Close();
zip.Close();
 

לא לשכוח לסגור את הקובץ בסוף!
ובשביל לקרוא קובץ מכווץ התהליך דומה, נפתח את הקובץ שמכיל את המידע המכווץ:

FileStream source = new FileStream(Server.MapPath("myzip.zip"), FileMode.Open);

את הקובץ שאליו נשמור את המידע שנפתח:

FileStream target = new FileStream(Server.MapPath("myfile.txt"), FileMode .Create);

נבנה את האובייקט וכעת נחבר באופצית הפתיחה, לא כיווץ:

GZipStream zip = new GZipStream(source, CompressionMode .Decompress);

וכעת נעביר את הבתים מהזיפ שלנו לקובץ המטרה:

int bytesCount;
byte[] buffer=new byte [1024];
while ((bytesCount = zip.Read(buffer, 0, buffer.Length)) != 0)
{
    target .Write(buffer, 0, bytesCount);
}
target.Close();
zip.Close();

להורדת הפרוייקט

Technorati Tags: ,

Currently rated 4.0 by 1 people

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: | Categories: C# Posted by talgiladi on 4/3/2008 8:49 PM | Comments (2)

מוזר שהרבה לא שמעו על המחלקה הזאת...
מה היא עושה? ובכן אנו יודעים שסביבת הריצה של הדוט נט סופרת הפניות לכל אובייקט. כשאני יוצר אובייקט חדש, המשתנה שאני מגדיר הוא בעצם הפניה, כתובת , לאובייקט שיצרתי בזיכרון. לדוגמה:

Bitmap picture=new Bitmap("pic.gif");

בחלק שמאל אני מגדיר הפניה בשם picture לאובייקט שיצרתי בצד ימין והוא מסוג Bitmap
וסביבת הריצה כותבת לה בצד שיש הפניה אחת לאובייקט הזה ולכן היא לא מנקה אותו מהזיכרון. בשורה הבאה:

Bitmap pic2=picture;

הגדרתי עוד הפניה בשם pic2 לאותו אובייקט בזיכרון, וסביבת הריצה כותבת לעצמה שיש 2 הפניות לאותו אובייקט. כל עוד יש הפניות לאובייקט סביבת הריצה לא יכולה לנקות את אותו מקום בזיכרון. מתי מורידים הפניות? או שהגדרתי משתנה בתוך פונקציה והפונקציה סיימה את תפקידה ואז אותו משתנה מסומן כהפניה אחת פחות. או שהגדרתי משתנה במחלקה עצמה ואותה מחלקה סיימה את תפקידה, או שבפירוש הודעתי שאני לא צריך את ההפניה על ידי :

picture=null;

עד כאן הייתה ההקדמה שרובנו יודעים. עכשיו לנושא שלנו. נניח שאני רוצה לשמור בזיכרון הפניה לאובייקטים כדי לא לפנות אליהם כל פעם מחדש, לדוגמה DataSet מתוך דטה בייס. אם אני אתחיל למלא את הזיכרון במידע הוא עשוי להיגמר, מצד שני אני רוצה שהאפליקציה תרוץ מהר ולא תמשוך כל פעם מהדטה בייס... בשביל זה ניתן להשתמש ב WeakReference. המחלקה הזאת מוסיפה הפניה לאובייקט, כך שהוא לא נמחק מהזיכרון, אך זאת הפניה "חלשה", זאת אומרת שאנחנו לא מכריחים את סביבת הריצה לשמור את האובייקט תמיד בזיכרון, זאת יותר מעין בקשה - תשמרו לי הפניה לאובייקט, אבל אם הזיכרון מתחיל להיגמר אתם יכולים למחוק אותו ואז ההפניה שלי תצביע לאובייקט שלא קיים...
זה כל הסיפור... שימו לב לקוד:

System.Drawing.Bitmap picture=new System.Drawing.Bitmap("pic.gif");//we save a big object in memory
WeakReference wr = new WeakReference(picture);//assign a weak reference to it
picture = null;//dispose the strong reference
//do other stuff
System.Drawing.Bitmap mypicture = wr.Get() as System.Drawing.Bitmap;//we try to get our picture
if (mypicture == null)//we check if it still exists... null? it has bee disposed already...
{
    mypicture = new System.Drawing.Bitmap("pic.gif");
}

יצרתי אובייקט שתופס הרבה מקום וגם לוקח זמן לטעון אותו.
יצרתי הפניה חלשה אליו.
הודעתי שאני לא רוצה את ההפניה החזקה אליו. תזכרו שאם יש הפניה חזקה לאובייקט הוא לא ימחק וזה לא מה שאני רוצה!
כעת אני עושה דברים אחרים באפליקציה...
עכשיו כשאני רוצה להשתמש באובייקט התמונה שלי, אני שוב יוצר הפניה חזקה אליו בשם mypicture
אבל... וזה כל העניין פה... אני צרי לבדוק שעדיין יש לי אובייקט! כל הקטע הוא שאני הרשיתי לסביבת הריצה למחוק את האובייקט במקרה הצורך, ולכן אני צריך לבדוק שהוא לא נמחק...

Technorati Tags:

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , | Categories: JavaScript Posted by talgiladi on 4/2/2008 9:46 AM | Comments (3)
Technorati Tags: ,

מצאתי 2 פונקציות טובות למציאת מיקום מדויק של אלמנט על המסך , אך לצערי צריך לנסות את שתיהן, כי יש דפים שבם אחת מחזירה תוצאות יותר מדויקות ויש דפים שהשניה... ומכיוון שאינני מומחה כל כך גדול בג'אווה סקריפט, אני גם לא יכול לשפר אותן, אבל עדיין, הן טובות, רק תעשו ניסוי קטן בכל דף לבדוק איזו מהן מתאימה

הפונקציה הראשונה - שולחים לה את האובייקט (לא את השם שלו...) והיא מחזירה אובייקט עם ערך x וערך y

function zxcPos(zxcobj){
    var position = new Object;
    zxclft=zxcobj.offsetLeft;
    zxctop=zxcobj.offsetTop;   
    while(zxcobj.offsetParent!=null){
        zxcpar=zxcobj.offsetParent;
        zxclft+=zxcpar.offsetLeft;
        zxctop+=zxcpar.offsetTop;
        zxcobj=zxcpar;
    }
    position.x=zxctop;
    position.y=zxclft;
    return position;
}

הפונקציה שניה בנויה משני פונקציות בעצם, אחת מחזירה את המיקום x ואחת את המיקום y

function findPosX(obj)
{
    var curleft = 0;
    if(obj.offsetParent)
        while(1)
        {
            curleft += obj.offsetLeft;
            if(!obj.offsetParent)
                break;
            obj = obj.offsetParent;
        }
    else if(obj.x)
        curleft += obj.x;
    return curleft;
}
function findPosY(obj)
{
    var curtop = 0;
    if(obj.offsetParent)
        while(1)
        {
            curtop += obj.offsetTop;
            if(!obj.offsetParent)
                break;
            obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
}

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5